From ca89b1d61808e71203c4d126a0fa18953c2d8c81 Mon Sep 17 00:00:00 2001 From: Kevin Rohlf <123676073+KevinRohlf@users.noreply.github.com> Date: Fri, 8 Nov 2024 12:39:07 +0100 Subject: [PATCH] feat: merge new features (#58) * feat: merge new features * fix: rename verifiedWallets to verifiedAddresses and remove duplicate code * chore: update footer section name, ConsumerParameters validation & footer privacy link name * fix: privacy link & address resolution * chore: updated verifiedAddresses * chore: updated imprint link * feat: faucet disabled by default * chore: updated ecosystem & announcement --------- Co-authored-by: Moritz Kirstein --- .github/CODEOWNERS | 13 +- .vscode/settings.json | 2 +- address.config.js | 255 +------ app.config.js | 3 +- .../serviceCredentialForm.json | 45 ++ content/pages/faucet.json | 18 +- content/pages/privacy/en.md | 34 +- content/site.json | 55 +- genxAddress.json | 20 - networksMetadata.config.js | 22 - package.json | 2 +- pontusxAddresses.json | 647 ++++++++++++++++++ scripts/copy-addresses.js | 8 +- .../Automation/AutomationProvider.tsx | 34 +- src/@context/MarketMetadata/_types.ts | 16 + src/@context/UserPreferences.tsx | 28 +- src/@hooks/useAddressConfig.ts | 8 +- src/@hooks/useBalance.tsx | 21 +- src/@hooks/useNetworkMetadata/utils.ts | 3 - src/@types/AssetExtended.d.ts | 4 +- src/@types/TokenBalance.d.ts | 8 + src/@utils/compute.ts | 22 +- src/@utils/dispenser.ts | 17 +- src/@utils/downloadJSON.ts | 21 + src/@utils/faucet/index.ts | 8 +- src/@utils/ocean/index.ts | 1 + src/@utils/onboarding.ts | 2 +- src/@utils/wallet/index.ts | 16 +- src/components/@shared/AssetList/index.tsx | 26 +- src/components/@shared/AssetTeaser/index.tsx | 4 +- .../@shared/DDODownloadButton/_validation.ts | 24 + .../@shared/DDODownloadButton/createJSON.ts | 73 ++ .../DDODownloadButton/index.module.css | 18 + .../@shared/DDODownloadButton/index.tsx | 120 ++++ .../DDODownloadButton/inputWithList.tsx | 82 +++ .../ConsumerParameters/_validation.ts | 2 +- .../InputElement/FilesInput/index.tsx | 2 +- .../FormInput/InputElement/Provider/index.tsx | 4 +- src/components/@shared/MenuDropdown/index.tsx | 8 +- .../@shared/NetworkStatus/index.tsx | 84 +++ .../@shared/Onboarding/Main.module.css | 4 +- .../@shared/Onboarding/StepHeader.tsx | 7 +- src/components/@shared/Publisher/index.tsx | 14 +- src/components/@shared/atoms/Button/index.tsx | 2 +- .../@shared/atoms/Tooltip/index.tsx | 2 +- src/components/App/index.tsx | 2 +- .../Compute/FormComputeDataset.tsx | 4 +- src/components/Asset/AssetActions/index.tsx | 4 +- .../Asset/AssetContent/MetaMain/MetaAsset.tsx | 2 +- src/components/Asset/AssetContent/index.tsx | 12 +- src/components/Faucet/index.module.css | 97 ++- src/components/Faucet/index.tsx | 175 ++--- src/components/Footer/Links.tsx | 2 +- src/components/Header/Menu.tsx | 32 +- .../UserPreferences/Automation/Balance.tsx | 16 +- .../UserPreferences/Automation/Details.tsx | 8 +- .../UserPreferences/Automation/index.tsx | 20 +- src/components/Header/Wallet/Details.tsx | 2 +- src/components/Home/Ecosystem/Card.tsx | 28 +- src/components/Home/Ecosystem/index.tsx | 1 + .../Home/TopSales/Account/index.tsx | 4 +- src/components/Profile/Header/Account.tsx | 4 +- .../Publish/Navigation/index.module.css | 27 +- src/components/Publish/Pricing/Fees.tsx | 2 +- src/components/Publish/index.tsx | 1 + src/pages/faucet.tsx | 31 +- src/stylesGlobal/styles.css | 1 + 67 files changed, 1694 insertions(+), 590 deletions(-) create mode 100644 content/DDOtoServiceCredential/serviceCredentialForm.json delete mode 100644 genxAddress.json create mode 100644 pontusxAddresses.json create mode 100644 src/@utils/downloadJSON.ts create mode 100644 src/components/@shared/DDODownloadButton/_validation.ts create mode 100644 src/components/@shared/DDODownloadButton/createJSON.ts create mode 100644 src/components/@shared/DDODownloadButton/index.module.css create mode 100644 src/components/@shared/DDODownloadButton/index.tsx create mode 100644 src/components/@shared/DDODownloadButton/inputWithList.tsx create mode 100644 src/components/@shared/NetworkStatus/index.tsx diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 08019a7e..6a399c72 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1 +1,12 @@ -* @moritzkirstein @oceanByte +# Base ownership of the codebase +* @deltaDAO/frontend + +# The following content related files are additionaly owned by the qa team +# File to manage portal whitelists and featured assets +address.config.js @deltaDAO/qa @deltaDAO/frontend +# File to manage address resolution +pontusxAddresses.json @deltaDAO/qa @deltaDAO/frontend +# Directory including .md and .json files to manage displayed content +content/* @deltaDAO/qa @deltaDAO/frontend +# Directory managing publicly hosted images +public/images/* @deltaDAO/qa @deltaDAO/frontend diff --git a/.vscode/settings.json b/.vscode/settings.json index a7ced1c8..336b6d05 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,6 +1,6 @@ { "editor.codeActionsOnSave": { - "source.fixAll.eslint": "always" + "source.fixAll.eslint": "explicit" }, "editor.defaultFormatter": "esbenp.prettier-vscode", "editor.formatOnSave": true, diff --git a/address.config.js b/address.config.js index 728aa972..374688f8 100644 --- a/address.config.js +++ b/address.config.js @@ -1,3 +1,5 @@ +const PONTUSX_ADDRESSES = require('./pontusxAddresses.json') + module.exports = { whitelists: { 'nft.owner': [ @@ -6,17 +8,17 @@ module.exports = { '0x9dfbda23b65efB1c836828D74a96eB8528A60f3C', '0xb2AF8b92bFaC5299Cb6EDEf16150BFD1d4d26a93', '0x3dB4E0b1fC6072271BF51e9a0CC17E3c7C4C99f5', - '0x9B421d0f5d378b66324251d6CDc1945a6560110b', // SIMAVI - '0x13a9FfFC7fb684CCc623C305B46b7eD6b3a73C66', // ENGINSOFT - '0x7d46Bb46ba45f08480bA80150d3594fd9f3e212d', // IMT Atlantique - '0x670E5512aDBE5fAD672d825800f4a4A23Be744D1', // Fraunhofer IAO - '0xc9034e58176c59153F53C6B59d5CFD5BBD58b5Fc', // Aarhus University - '0xB9fB84b093D8bE26A78208b324D8074627374F49', // HWR Berlin - '0xEEC041b73BC4FcAE2B0a66F9992d2b6d1959BbD1', // Tronico SAS - '0x7e7cea5dda047F66b8755Cb4Bf1d8eDBFB236e35', // Airbus Atlantic - '0x13f8514cA72C83386929f0BAa9bCe6B840cbA03A', // Continental Automotive - '0x98bDc1EaDE6D4ad7032A091Dc8bE6D217cB37eF3', // iED - '0x28080F654eED6CC00e8b16F4841E92CD0c2C0778' // deltaDAO + '0x9B421d0f5d378b66324251d6CDc1945a6560110b', // SIMAVI + '0x13a9FfFC7fb684CCc623C305B46b7eD6b3a73C66', // ENGINSOFT + '0x7d46Bb46ba45f08480bA80150d3594fd9f3e212d', // IMT Atlantique + '0x670E5512aDBE5fAD672d825800f4a4A23Be744D1', // Fraunhofer IAO + '0xc9034e58176c59153F53C6B59d5CFD5BBD58b5Fc', // Aarhus University + '0xB9fB84b093D8bE26A78208b324D8074627374F49', // HWR Berlin + '0xEEC041b73BC4FcAE2B0a66F9992d2b6d1959BbD1', // Tronico SAS + '0x7e7cea5dda047F66b8755Cb4Bf1d8eDBFB236e35', // Airbus Atlantic + '0x13f8514cA72C83386929f0BAa9bCe6B840cbA03A', // Continental Automotive + '0x98bDc1EaDE6D4ad7032A091Dc8bE6D217cB37eF3', // iED + '0x28080F654eED6CC00e8b16F4841E92CD0c2C0778' // deltaDAO ], 'datatokens.address': [ '0x25244fAad80E52E3d5E1f5f7B7D00132a97169D5', // Condition Monitoring Software - EuProGigant Validation Platform @@ -58,234 +60,5 @@ module.exports = { ] } ], - verifiedWallets: { - '0x28080F654eED6CC00e8b16F4841E92CD0c2C0778': 'deltaDAO AG', - '0x628677D9A9d93a913182fa04893Da0ce4E6570Ee': 'deltaDAO AG', - '0xf8A493af0e72C2C62651Bf7b7d1a006806Fb646f': 'deltaDAO AG', - '0xf5b1E6f9a566E20de35d0C240D47F9cc08f33c0F': 'deltaDAO AG', - '0x50499814AE402563b5c34F6BD2F5C829A7693964': 'deltaDAO AG', - '0x04863f1E29Ea1aBF006fB1ecB129cAD892db0C90': 'deltaDAO AG', - '0xdA9ED09a94B1A2315e22157d75fd0b0bfC63B6Cc': 'deltaDAO AG', - '0x7AF6c5F0950A37b7C25da4367E9B56C03dE8234D': 'deltaDAO AG', - '0xC0E3B447c1e7B22769952E89389Ef2cD9B812Cc5': 'deltaDAO AG', - '0xBf252dD5b3a31A50Db34113e12517b21D143AC52': 'deltaDAO AG', - '0x0bd21cF4Da78f74c483a1109ac3A30794FBd556B': 'deltaDAO AG', - '0x9c26685b6E8e2997d9aAf3f1a642f1b1b3dB9580': 'deltaDAO AG', - '0xd0ea08826FA10eEaA3871a6AE680E5f15149F355': 'deltaDAO AG', - '0x4C84a36fCDb7Bc750294A7f3B5ad5CA8F74C4A52': 'deltaDAO AG', - '0x68C24FA5b2319C81b34f248d1f928601D2E5246B': 'deltaDAO AG', - '0x2859d961a6dBa6e7d30b2d383Af468edb4E7F4f6': 'deltaDAO AG', - '0xaBaf56FC1bB6b4FF9fA4378C3C8723d2B2444324': 'deltaDAO AG', - '0x0a7B96885b28deDE4a6887CA1150E36edb385BeE': 'deltaDAO AG', - '0xDF1c35c3d5178e9d98043b35a6737Bd861c191c9': 'deltaDAO AG', - '0x01e66950353400E93AEe7F041C0303103E2ef5Ab': 'deltaDAO AG', - '0x862E3fe199723945a38871dE4F736f1233589CE5': 'deltaDAO AG', - '0xFDC7BEc0aED8a584577fd59CbF56805eE8c976B3': 'deltaDAO AG', - '0x5f525cd29377DC2155C2AbCDaC0Ce45e630318b7': 'deltaDAO AG', - '0x3a69B365769a9dAb67865Ca5530c4B1D5259bCb7': 'deltaDAO AG', - '0x97870c129abc9877b66534e49f152585D6Ca3655': 'deltaDAO AG', - '0x1Ad061ad839f82C05767dACd2B5ab384E72B45a5': 'deltaDAO AG', - '0xFd4b5ae43f2aA446b02209098438890d3998cC9F': 'deltaDAO AG', - '0x732BF4fA8E57200621b0e1acbe8855c238823016': 'deltaDAO AG', - '0xa76Fa6837A6ffc9F123F2193717A5965c68B0cbA': 'deltaDAO AG', - '0xFaeb57c16D5E9A9f06c8c5dB12796f5a432Eb7d6': 'deltaDAO AG', - '0xb501FDaad0F0863C4c72f7EB9Abc23965DCa973d': 'deltaDAO AG', - '0x3dB4E0b1fC6072271BF51e9a0CC17E3c7C4C99f5': 'deltaDAO AG', - '0xe2DD09d719Da89e5a3D0F2549c7E24566e947260': 'deltaDAO AG', - '0x1072D3287A5cC513F40b425735E04355487f5F57': 'deltaDAO AG', - '0x26818079Ba707b2facFfcdc41445322f0e7e3042': 'deltaDAO AG', - '0x18aa7C29527E71b9F295f1bfB63e57F5a0A97282': 'deltaDAO AG', - '0x8d4198E9af22863d4269dDA6a41eF2BfA187AbAc': 'deltaDAO AG', - '0xb4026ac3562245bB0DAb9205D698Ab0410e3d723': 'deltaDAO AG', - '0x24D68bFBA0fB06ccFfD21dC3a5c0B65207Bd479a': 'deltaDAO AG', - '0xFB7Cb9F2E15F3935B22FB9846d69b46bD31edf07': 'deltaDAO AG', - '0xa51815143e6C578D3c27A7b6fA6E4C1Dfcac555C': 'deltaDAO AG', - '0x6432956a98E522F1B8a73a45245a5C6ff2c7f8f1': 'deltaDAO AG', - '0xD1Cb3E73a7bC632d2279114AA2783dcaD06517ca': 'deltaDAO AG', - '0xAEC291E9Eb4293d45a5B8aBE3549c0C7464e5C24': 'deltaDAO AG', - '0x4c7BfE3D6278eb996FC13c5f748bC7b1dBe593D8': 'deltaDAO AG', - '0x4A806a4851472F7cFd579d3FF5465F03c3c2B5d4': 'PTW - TU Darmstadt', - '0x21CF19e1FaF3A62f82B432f82152e8c5C0FdBdaF': 'PTW - TU Darmstadt', - '0x9f4ceE0eBD03a1e9E4DcffaF876873d7a3e9595c': 'PTW - TU Darmstadt', - '0x6E7bec8715955B6Cc90A5A1767cd981b90C5a245': 'PTW - TU Darmstadt', - '0x81336c245712DbF0E971de5463173bCaA9826d84': 'IONOS Cloud', - '0x56eA3Cc92144Db3bA2bdE25131F40c7B98F7eD32': 'Exoscale', - '0x9Dc6aDA184fc98012D74F1C4f3f223183A4745D4': 'Wobcom', - '0x0337b320DEfAddd9aDbC518f8A9cee30b606d15b': 'Arsys', - '0xD7b90d6476091F6bc4CAaC40180FB300351fAb9F': 'Arsys', - '0xF20113edd04d98A64AD2A003B836677E1c9aACAD': 'State Library of Berlin', - '0x0279F7D611e8745BA16A4F1e83B752f8fc173870': 'State Library of Berlin', - '0x6B33b4Cc1CAa5b49bB2752D23B9B78e524e17654': 'State Library of Berlin', - '0x23035d7E3cddc44b345eBF9DDDA2e1aaeCeeEeA1': 'State Library of Berlin', - '0xb98B9304860Be2a90F86CFa738dbedEb6C6AdF98': 'State Library of Berlin', - '0xE098a4DE67034a17b23CDfB7E81C49296361974F': 'State Library of Berlin', - '0x67c39F79B1e5430104bCc4009A6210EAeB2672Bf': 'State Library of Berlin', - '0xEF193A800e956b9fF1c379B7Ac3C55FCA38aDB15': 'State Library of Berlin', - '0x8337649C1d86ab41d42ef91E303B814f9FfEC04d': 'State Library of Berlin', - '0xC309b5Cd4833315D495F8616A1B957E6c3F0Cc0b': 'State Library of Berlin', - '0x04707912117fb09c68F48BDC15Cf78F50501fF92': 'State Library of Berlin', - '0x92DCe2e6b29863CF190c520B81CB4153f2642a49': 'State Library of Berlin', - '0xD274318C312174eb7CCe872eE415b7398c8dA2be': 'State Library of Berlin', - '0x2E32B0e4e20C7A4162A6455b4A12e01D09472556': 'State Library of Berlin', - '0x4d7fE037831F077583a259B6437E542EffD6f2cD': 'State Library of Berlin', - '0xdf89102cDd2ccA60E88e480C6D609FB3bfFD4d54': 'State Library of Berlin', - '0x62078F05Eb4450272D7E492F3660835826906822': 'University of Lleida', - '0xa702032E187E6A53EAddC28a735B414220712689': 'Software AG', - '0x0a477f6297413f20C4fBc15F93e34dacE4136123': 'Software AG', - '0x586000e6DA330E140b11a4aeEbb81963d67F336b': 'TU Wien', - '0xf596D17C4a3A5c92c4721627B9e5E5064651BF46': 'Materna SE', - '0xE90e1f337cBBaeD2bf30dD66165246e477F59158': 'Materna SE', - '0x3CEA8fBCbD1c745E081fD3937C18eE0b6Cc3f1b1': 'Airbus', - '0xF8dB4a6d529a14e3E029e2b8A9279f408909Fa20': 'OHB', - '0x48535044200dAE3FD4f5b5C3f9b077fa5c230Ef3': - 'T-Systems Multimedia Solutions GmbH', - '0x212c355c3ce41a272606da61F661dDd2b7F8a4B1': - 'IKS - Gesellschaft für Informations- und Kommunikationssysteme mbH', - '0x44C34FbBB727bDC648E65feCfF3FB9D4c85f1fe4': 'msg David GmbH', - '0x8fBF860883BB71D691053A4363030Dc1c65f7017': 'Detecon', - '0x7DF1674a1e3449778eEB324652d3FF3Cb5046753': 'SINTEF', - '0xe3Df4851c094f5F6F1AC9AbfA4FC2075276195Ec': 'Peaq', - '0xB21282F443EB0D490819d98F2976758af5C979B3': 'Datarella', - '0x0aec046a558F13Ff18aAEc5E6f76084185358cdf': 'Datarella', - '0x6fE8aD445AD86b3d1325F79955Ef28d6e9cb2258': 'Bosch', - '0x51Decd187744bCfAD1BAb0A3E71dD68fAC0ba478': 'TU Dortmund', - '0xa98A6eefbAE870b88a9C7A43f4b50066A01c93b6': 'RWS', - '0x9dfbda23b65efB1c836828D74a96eB8528A60f3C': 'Craftworks', - '0xb2AF8b92bFaC5299Cb6EDEf16150BFD1d4d26a93': 'Concircle Österreich GmbH', - '0x2b92BF0496B7B41ea2d723325DDE96651795c784': - 'DENSO AUTOMOTIVE Deutschland GmbH', - '0xe761F8e33c71D08A9323Cb2c711aB4Fae2634276': - 'DENSO AUTOMOTIVE Deutschland GmbH', - '0x895975869261A215813e33568a295F94A3F301ed': 'Struggle Creative Oy', - '0xDa4fc9E82Ac4E44207a1f74137493D3437D80761': 'Sphereon', - '0xfc739f2F91921eb710878ad2Ca38C147a784C96f': - 'Austrian Institute of Technology', - '0xF62bF6371Ee020Cb2164Ac3C338514DBbb93A0D4': 'acatech', - '0x6E1cE3530A12F89cF567788C132454E5dC7D3cCE': - 'Spanish Ministry of Economic Affairs and Digital Transformation', - '0x943CaA8afCAdd2F64a7cE9E53A91d5ea0BEb40c1': 'Eviden Germany GmbH', - '0x7A6246e02B2aA276203469Cfb839a2666520D8b5': 'Eviden Germany GmbH', - '0x9391291b0Df512B20810183744De8272774b6655': 'TU Delft', - '0x2ee3c4F19f90237B7C45cfAD6B5dC4b5840563Ec': 'Perpetuum Progress GmbH', - '0x203C7AA993EED06932FA327a192de9A8370b5Ab4': - 'Mercedes-Benz Singapore Pte. Ltd.', - '0x4d6240C7Ef355a2E85c13B26A49A35908ce853E5': - 'Mercedes-Benz Singapore Pte. Ltd.', - '0x2E33C6014222A47585605F8379a1877eaaF0ec13': - 'Mercedes-Benz Singapore Pte. Ltd.', - '0x6bF77769e84045a9EAC64573e70a5562457C52ad': - 'Höchstleistungsrechenzentrum Stuttgart (HLRS)', - '0x17c8D253443F9E7305A2539d7aF177B21aAD3355': 'Ruhr-Universität Bochum', - '0xFDF411B7A23182e7F0a635bdF0d25f0fCb2aAf74': 'north.io GmbH', - '0x3560626F234eD181E807E4e31ded56D9aca1ac58': 'CONTACT Software GmbH', - '0xF0926FbE8e60E54aFB4fD296B2698230ab32799b': 'Universität Siegen', - '0xAA782a260Ad773bca5Ff0535356CB0F7B94Cd254': - 'AWS-Institut für digitale Produkte und Prozesse gGmbH', - '0x2aC6802160A74677B7cEC1aaD7E41Ec968D57896': '5D Institut GmbH', - '0xFd1BEC7E551fAeA6102045D720dD693c4e9C8E06': 'Accenture', - '0xa2199E3f60fC244037Efd5A77714CC05F604F855': - 'Airbus Defence and Space GmbH', - '0x5101ea56E29f5dc03285809b6157f0588ff255D0': 'Bernard Technologies GmbH', - '0x8B7f2b75B7F87D3125C8B0eDB85639B441BBcE21': - 'Deutsches Forschungszentrum für Künstliche Intelligenz GmbH', - '0xb11124Dfa40E44b3283068fd07bf6FdE60caf06A': - 'Hochschule für angewandte Wissenschaften Kempten', - '0x632460b14aDd90aD9430e381B4662779cC1ab7a6': - 'Fraunhofer-Institut für Graphische Datenverarbeitung IGD', - '0x1f65110b63B6044f1E92543C09231842131798C7': '52°North GmbH', - '0xDFa29AE20eac7f203DdDbe15E1830985e99143B8': 'TrueOcean GmbH', - '0xFfA05d656465568BE83B11bf274c5458AC8401AC': - 'Institute for Language and Speech Processing', - '0xb500BfE3d89b5D6b0d2b91841c3A3aD568Cb0FdC': 'Vicomtech', - '0x8BF36BEFC22a7b9c1a546139bFd4ae8420bcFf0e': 'Fraunhofer IAIS', - '0x2dB30B996C0E2990F836685Cf1A2939b3299f8e5': - 'Berger Holding GmbH & Co. KG', - '0x224482ebcf914b9FA9E312036B377e26B676E534': 'Christoph Kroschke GmbH', - '0xD580c01E2f503287006138a94eBBc537Fe7eBD25': 'Brinkhaus GmbH', - '0x4B107057aB8278c7d9436bf76230d16e5F7BaD16': 'Gühring KG', - '0x7bf493b142AB0bb37c7f766A1585245901891685': - 'Fraunhofer-Institut für Werkzeugmaschinen und Umformtechnik IWU', - '0x1c0c9211E8Ec8E0253A53880D5481e4580B62125': - 'imc information multimedia communication AG', - '0xEEe803bEFd2B4f229E57523Edb11CDE38DD1a23E': 'SAP Fioneer GmbH', - '0xb828bA1850aA11daA1890896573Aa6008221A671': 'NT Neue Technologie AG', - '0x005d24698bF41c398ECF15a93455621932a6e19F': 'IONOS SE', - '0x746d4715c24fc4d26D02A558ACF98dC717C68E1e': 'ScopeSET GmbH', - '0x1Bf21DCb771Aba18B1D23AA6D8a619C1AB1811a4': 'RIB Software GmbH', - '0x04FEA446847c3539d35Cca0a74Cb82Da811BAfc3': 'msg DAVID GmbH', - '0x69bF63B2Bb6A93fc4ff434595A72a4ED313E5698': 'Arvato Systems GmbH', - '0xEdfd506dd449Cd06c91f51Fe9DfE4e3E57B2F8f5': - 'Fraunhofer-Institut für Produktionsanlagen und Konstruktionstechnik', - '0x0763BfBcBfA0126b5A5509fB1185b7b6476BdAd8': 'OSISM GmbH', - '0x54d2946677CC16E06Efd6161A4abFA17fc98Afc3': 'Netcompany-Intrasoft S.A.', - '0x5880C2C30C922FE700fc079e1b6BBa7e9E7DE577': 'Stackable GmbH', - '0xc2350eA5913511A95c1aBED51de377A0b92846Be': - 'FZI Forschungszentrum Informatik', - '0x0c85Cd08E6643Fa3E4B75268431d19CcFC99C916': 'ProCarement GmbH', - '0x1153265057782e8C57292CA590E50acC36037204': - 'Hochschule Furtwangen University (HFU)', - '0xF211efa0C51559e6730db3Ba6FE1f1D46A68BE14': - 'Daten-Kompetenzzentrum Städte und Regionen DKSR GmbH', - '0x7209bd8fDd841358a3CF9E7DaD8D9dCe2E4BbBB8': - 'GMN Paul Müller Industrie GmbH & Co. KG', - '0xDB5807EacA2937f6264c5725538f8Ec357b4d3b2': - 'Fraunhofer-Institut für Offene Kommunikationssysteme FOKUS', - '0x8482256AC35fcA568a53CfD77Af9538FEC0691bb': 'Bechtle Aktiengesellschaft', - '0x985f314171DFc0Ec3443E32b262c3135E094eD72': 'Bundesdruckerei Gruppe GmbH', - '0x99c030936B5E7381E65B645d3762A93147EB15F7': 'Fraunhofer IOSB', - '0x7104a77Ca5FfC6D3f0840048C307d05EA3b529C0': 'embeteco GmbH & Co. KG', - '0x9c373e9f125497281f37AeF603fa99572856Bc38': - 'T-Systems International GmbH', - '0x8FAF0702C51c94b5848774129047d75cEe49EE87': 'IPROconsult GmbH', - '0x3EAbA16E4Ac451D85839A42eb9e7C61F157C88b7': 'Elektra Solar GmbH', - '0x1c99F7C29EE0e79CAAD8E4d0Cc0b95D5Ece62294': 'Setlabs Research', - '0xb9C596E9eC598a865b51f3F53ae7d122B7b7a937': 'Schüßler-Plan Digital GmbH', - '0xb7cF56a08F2B6ccF250B431125850968b7f6a950': - 'Data Machine Intelligence Solutions GmbH', - '0x4476123c4B4706cf88CbfA055b72726Baa1e8041': - 'Deutsches Zentrum für Luft- und Raumfahrt e. V. (DLR)', - '0x9309Ce467475DbB0a9c549B988F6571EB024507C': 'OHB System AG', - '0xb51d556E910Dd1887602034bbB66DA63EaA80ce2': - 'C&S Computer und Software GmbH', - '0x007dB3DC8De9ae0F8AfeeBf1f7C92CcbD1A75Fd7': - 'eco - Verband der Internetwirtschaft e.V.', - '0xe70bBA7bC033Bf1Ce6Fa3328eCFAAc8966E66966': - 'Institut für Automation und Kommunikation e. V.', - '0xE4EE92b3a6B661b7148305Fa3A8d96062CBFAFc5': 'Fujitsu Services GmbH', - '0x37e01308d6A0E322dECc457a13E0B2b2086D84B1': 'RADIUSMEDIA KG', - '0x9Adf8e343ec1C7dB2B44e420bB8F4Cc51dEbFb7a': - 'ahu GmbH Wasser Boden Geomatik', - '0xE64872A181F0695DA0660fE0B809a89A3bA359AA': 'Hochschule Offenburg (HSO)', - '0x533d456D3D5c16E6390647E2167678b7a76A4840': 'FeltLabs', - '0x56e194D46fF305560f51D06cE84649C1DD91d2F8': 'FeltLabs', - '0x61DB12d8b636Cb49ea09eCa58a893dA9480E1F33': 'BigchainDB GmbH', - '0xC8a08b33995594bfdB0ef9c18EB72da0469E396F': 'Deal ex Machina', - '0x289Ff19C1e544B6E9488d5E79966491A2bAa88C9': 'Deloitte', - '0x2650e382770A04bE0f7E362ed578FB261A60F4b3': '3D Mapping Solutions GmbH', - '0x172b3eB3BDa62e81c171d340eC4a8C70f3d044EF': - 'Vodafone Group Services Limited', - '0xf1F30d7048775F02139Be30067e984F2C2d1812a': - 'Vodafone Group Services Limited', - '0xc21854fC5B997afa00c75b5098842a61F6E18e5B': 'Feuerwehr Braunschweig', - '0x3561F6126Ce77A98fdC09DA2815919d5E04879D5': - 'Airbus Defense and Space GmbH', - '0xaDD9344fc33530dE1F2fb338de4Cf25f7d8a6E92': - 'Airbus Defense and Space GmbH', - '0xD9d17aC4b23222D0F9055723127acCaeeE834AD7': - 'Airbus Defense and Space GmbH', - '0x81c337F4a5113E30919F588F178a361ade1D1Be2': 'ZARM Technik AG', - '0xA38E2b6fFf3d9c66270253c7fE4Dcb5B088020D5': 'htw Saar', - '0x3BB6944351d156fAF798f952C2838ef5bac68E40': - 'Centre de Visió per Computador (CVC)', - '0xC09c6A1d5538E7ed135d6146241c8da11e92130B': - 'Freie und Hansestadt Hamburg', - '0xA933f297ca605434850419951685ACeEcE2Bc88e': 'IGH Infotec AG', - '0xd1E02B17524C53B337C22BF9D414bc15f933C3f0': 'itemis AG', - '0x4DdaE8989871DB4fAB65d62775e20c577340F8bE': 'inovex GmbH', - '0xAaeA7A824cffffFFf9Dd6EC51D7D7B0abA3f205F': 'neusta aerospace GmbH', - '0xf9eaebd346E9D414f4D4210CB12e43cc226038cF': 'DLR GfR mbH', - '0xdbe749D939ea958aC64A5bdf163B05096E260572': 'Valispace GmbH', - '0xAE823B7a6ad5b79da6d180Dbe91E7C810abAcCA4': 'grandcentrix GmbH', - '0x2B9C7E0d7Be68ec6b519Dad050CD0A4bf130B6A4': 'DIO' - } + verifiedAddresses: PONTUSX_ADDRESSES } diff --git a/app.config.js b/app.config.js index f7f767b8..24253ca1 100644 --- a/app.config.js +++ b/app.config.js @@ -103,11 +103,12 @@ module.exports = { errorMargin: 10, // Map chainIds to their respective status endpoints statusEndpoints: { - 100: 'https://status.genx.delta-dao.com/api/check-blocks' + 32456: 'https://status.dev.pontus-x.eu/' } }, faucet: { + enabled: process.env.NEXT_PUBLIC_FAUCET_ENABLED || 'false', baseUri: 'https://faucet.api.pontus-x.eu' } } diff --git a/content/DDOtoServiceCredential/serviceCredentialForm.json b/content/DDOtoServiceCredential/serviceCredentialForm.json new file mode 100644 index 00000000..f586d327 --- /dev/null +++ b/content/DDOtoServiceCredential/serviceCredentialForm.json @@ -0,0 +1,45 @@ +{ + "metadata": { + "title": "Metadata", + "fields": [ + { + "name": "didweb", + "label": "Service Provider DID:WEB ", + "placeholder": "did:web:yourdomain.eu", + "help": "The DID:WEB of the service provider / issuer publishing the Gaia-X Service Credential.", + "required": true + }, + { + "name": "credentialHostingPath", + "label": "Service Credential Hosting Path ", + "placeholder": "https://yourdomain.eu/.well-known", + "help": "The base path to your public storage of Gaia-X Service Credentials.", + "required": true + }, + { + "name": "pathToParticipantCredential", + "label": "Service Provider Participant Credential ", + "placeholder": "https://yourdomain.eu/.well-known/participant_vp.json", + "help": "URI of the service provider Gaia-X Participant Credential required to identity the responsible service provider.", + "required": true + }, + { + "name": "knownDependencyCredentials", + "label": "Known Dependency Credentials", + "placeholder": "https://www.yourdomain.eu/.well-known/2210_gx_service_provider_1.json", + "help": "Contains resolvable links to the Gaia-X service credentials related to this service that can exist independently of it.", + "required": false + }, + { + "name": "knownAggregatedServiceCredentials", + "label": "Known Aggregated Resource Credentials", + "placeholder": "https://www.yourdomain.eu/.well-known/2210_gx_resource_data_road_condition_7.json", + "help": "Contains resolveable links to Gaia-X Resource and Service Credentials related to this service that can exist independently of it.", + "required": false + } + ] + }, + "submission": { + "title": "Submit" + } +} diff --git a/content/pages/faucet.json b/content/pages/faucet.json index ce49b47a..14b4921c 100644 --- a/content/pages/faucet.json +++ b/content/pages/faucet.json @@ -1,9 +1,17 @@ { "title": "Pontus-X Faucet", - "description": "Get 1000 EUROe fee and payment tokens for the Pontus-X network every 12 hours.", - "input": { - "label": "Your Pontus-X address", - "placeholder": "0x28080F654eED6CC00e8b16F4841E92CD0c2C0778", - "buttonLabel": "Get tokens" + "description": "Request tokens for the Pontus-X Networks", + "buttonLabel": "Get Tokens", + "card": { + "cardTitle": "Welcome to the Pontus-X Faucet", + "cardDescription": "A faucet is a service that provides free tokens for testing purposes. Known accounts can request 10 EUROe fee tokens and 1000 EUROe payment tokens to use on the Pontus-X network. These tokens are available every 12 hours.", + "cardExplainerTitle": "How to Request Tokens", + "cardExplainerFirstStep": "Ensure you have a web3 wallet (e.g. MetaMask) connected.", + "cardExplainerSecondStep": "Your wallet address will be automatically detected and displayed below.", + "cardExplainerThirdStep": "Click the button to request your free tokens.", + "cardExplainerFourthStep": "Wait for a few seconds while the request is processed.", + "cardExplainerFithStep": "You will receive a confirmation once the tokens are successfully sent to your address.", + "cardNetworkAddress": "Your Pontus-X address", + "cardNetwork": "Connected Network" } } diff --git a/content/pages/privacy/en.md b/content/pages/privacy/en.md index 4a067da1..06e5622b 100644 --- a/content/pages/privacy/en.md +++ b/content/pages/privacy/en.md @@ -108,11 +108,39 @@ Gaia-X AISBL retains your personal data for as long as needed to provide their s Automated decision making including profiling does not take place. -## 6. Cookies and web storage +## 6. Cookies and Analytics -A cookie is a small file that stores Internet settings. Your web browser downloads it on the first visit to a website. The next time you open this website with the same device, the cookie and the information stored in it are either sent back to the website that created it (first-party cookie) or sent to another website it belongs to (third-party cookie). This enables the website to detect that you have opened it previously with this browser and, in some cases, to vary the displayed content. Web storage (local storage and session storage) has similar functionality to cookies. +**6.1 Cookies** -Our portal demonstrator does not use cookies or web storage for analytics or marketing purposes. We use your web storage to remember your page preferences, enable functionalities and to enhance your user experience. Your browser will remove the session storage once you close your browser. You have the option of disabling cookies and deleting cookies and web storage from your computer's hard disk at any time in your browser settings. +A cookie is a small file that stores information in your browser. Your web browser downloads it on the first visit to a website. The next time you open this website with the same device, the cookie and the information stored in it are either sent back to the website that created it (first-party cookie) or sent to another website it belongs to (third-party cookie). This enables the website to detect that you have opened it previously with this browser and, in some cases, to vary the displayed content. Some cookies are necessary for making websites work, and others are used for enhancing your experience on the visited website. Cookies can also be used for marketing and analytics purposes. Web storage (local storage and session storage) has similar functionality to cookies. + +Our portal demonstrator uses cookies and your web storage to remember your page preferences, enable functionalities and to enhance your user experience. You have the option of disabling cookies and deleting cookies and web storage from your computer's hard disk at any time in your browser settings. + +**6.2 Analytics** + +deltaDAO uses [Plausible Analytics](https://plausible.io/), a privacy-friendly web analytics tool for tracking overall trends in our website traffic. We create aggregated statistics based on our legitimate interest to gain insights to improve existing and future features and services, and to evaluate user engagement. Plausible Analytics does not use cookies or similar technologies that require information to be stored on your device. Instead, the tool focuses on analyzing aggregated data without the need to access your end device or store information there. + +Plausible Analytics does not track individual visitors and does not create persistent identifiers. It does not use cross-platform or cross-device tracking and does not pass on data to third parties. Plausible Analytics primarily uses data that is recorded by default in server logs, such as requested URLs, access times, HTTP status codes and transferred data volumes. This information is used to analyze website traffic. Data processing at Plausible Analytics takes place in two steps: + +- Pseudonymization: + + - When the data is received, it is pseudonymized using a hash function and a regularly changing key (“salt”). This process aims to change personal data in such a way that data subjects are no longer directly identifiable, but a distinction between sessions is made possible. + + - hash(daily_salt + website_domain + ip_address + user_agent) + + - Plausible Analytics never stores the raw data IP address and User-Agent in logs, databases or anywhere on disk at all. + +- Anonymization after 24 hours: Within 24 hours of pseudonymization, the data is completely anonymized by removing the “salt” so that it can no longer be traced back to the original user data. The remaining data does not allow any direct or indirect identification of data subjects. + +Plausible Analytics only uses EU-based service providers for hosting and additional services such as CDN and DDoS protection. The servers are located in Germany (operated by Hetzner) and additional services are provided by Bunny (based in Slovenia). + +deltaDAO signed a DPA with Plausible Analytics. + +- Here you can find Plausible Analytic’s current [DPA](https://plausible.io/dpa). + +- Here you can find Plausible Analytic’s [Privacy Policy](https://plausible.io/privacy). + +- Here you can find more information about Plausible Analytic’s [privacy practices](https://plausible.io/data-policy), [security practices](https://plausible.io/security) and a [legal assessment on GDPR compliance](https://plausible.io/blog/legal-assessment-gdpr-eprivacy). ## 7. External links diff --git a/content/site.json b/content/site.json index 62a04dc6..80ee674c 100644 --- a/content/site.json +++ b/content/site.json @@ -21,7 +21,6 @@ "name": "Faucet", "link": "/faucet" }, - { "name": "Log", "link": "https://explorer.pontus-x.eu/" @@ -30,12 +29,8 @@ "name": "Ecosystem", "subItems": [ { - "name": "Pontus-X Portal", - "link": "https://portal.pontus-x.eu/", - "description": "The Pontus-X reference ecosystem portal.", - "image": "deltadao-logo.webp", - "category": "ecosystem", - "isLive": false + "name": "Pontus-X", + "link": "https://www.pontus-x.eu/" }, { "name": "EuProGigant", @@ -70,19 +65,11 @@ "isLive": true }, { - "name": "Car Repair 4.0", - "link": "https://portal.autowerkstatt40.org/", - "description": "Car Repair 4.0 develops a hub infrastructure that connects car workshops to Gaia-X ecosystems and enables AI-supported fault tracking.", - "image": "carrepair40.webp", - "category": "AI", - "isLive": true - }, - { - "name": "Service-Meister", - "link": "https://servicemeister.pontus-x.eu/", - "description": "An AI-based Service Ecosystem for Technical Service in the Age of Industry 4.0.", - "image": "service-meister-logo.webp", - "category": "AI", + "name": "FIWARE", + "link": "https://fiware-marketplace-a4eqd.ondigitalocean.app/", + "description": "A curated framework of Open Source Platform components to accelerate the development of Smart Solutions.", + "image": "logo-fiware-full.webp", + "category": "smart city", "isLive": true }, { @@ -93,6 +80,14 @@ "category": "language models", "isLive": true }, + { + "name": "Car Repair 4.0", + "link": "https://portal.autowerkstatt40.org/", + "description": "Car Repair 4.0 develops a hub infrastructure that connects car workshops to Gaia-X ecosystems and enables AI-supported fault tracking.", + "image": "carrepair40.webp", + "category": "AI", + "isLive": true + }, { "name": "Flex4Res", "link": "https://flex4res.pontus-x.eu/", @@ -117,13 +112,29 @@ "category": "agriculture", "isLive": true }, - { + { "name": "Polish Agriculture Data Space", "link": "https://dataspaces.psnc.pl/", "description": "An open data space platform for sharing and marketing agri-related datasets guaranteeing data sovereignty.", "image": "PSNC.webp", "category": "agriculture", "isLive": true + }, + { + "name": "Service-Meister", + "link": "https://servicemeister.pontus-x.eu/", + "description": "An AI-based Service Ecosystem for Technical Service in the Age of Industry 4.0.", + "image": "service-meister-logo.webp", + "category": "AI", + "isLive": true + }, + { + "name": "deltaDAO AI marketplace", + "link": "https://market.delta-dao.com/", + "description": "With deltaDAO's AI Marketplace, you have the freedom to decide how your AI service is offered. By keeping your AI private, you retain full control and do not disclose your valuable IP.", + "image": "deltadao-logo.webp", + "category": "AI", + "isLive": false } ] }, @@ -153,7 +164,7 @@ "footer": { "notice": "The ACCURATE project is funded by the European Union, under Grant Agreement number 101138269. Views and opinions expressed are however those of the author(s) only and do not necessarily reflect those of the European Union or the European Health and Digital Executive Agency. Neither the European Union nor the granting authority can be held responsible for them.\n\nStart: 01/12/2023\nFinish: 30/11/2026", "copyright": "Built by [deltaDAO](https://delta-dao.com)", - "privacyTitle": "Privacy", + "privacyTitle": "Legal", "content": [ { "title": "External", diff --git a/genxAddress.json b/genxAddress.json deleted file mode 100644 index 30afcaab..00000000 --- a/genxAddress.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "genx": { - "chainId": 100, - "Ocean": "0xE945Bc2097d96B3FfB8e48bBb71ef7D3968f8597", - "OPFCommunityFeeCollector": "0x2e0C9e15A45c9884F7768BB852E7399B9153525d", - "startBlock": 1247152, - "Router": "0xc9f83F595C763e43Ddea97426E4030D03c9FFD70", - "FixedPrice": "0xFde80d4228B7dEf216E24f84e9BAc8458C5F232c", - "Staking": "0xE5517D71C61537e7693630f60Bd9E09f1215479a", - "ERC20Template": { - "1": "0x0301E8676e8bCa960dc95b8bd93D6AAf0B2F1020", - "2": "0xB3a2c32925b730348bb5177b1F8fBD1Ac90eBe63" - }, - "ERC721Template": { - "1": "0x9F13dE57BCf7462E6124b99C62a9F2CBc7860600" - }, - "Dispenser": "0x44cf54BA87fcE6882dF59ECe877a71ceaD5045a7", - "ERC721Factory": "0x16575f77c27A3437FE1bE56AB983f1bEb0DD14B2" - } -} diff --git a/networksMetadata.config.js b/networksMetadata.config.js index 7f1d9061..6443f932 100644 --- a/networksMetadata.config.js +++ b/networksMetadata.config.js @@ -2,28 +2,6 @@ // see: https://github.com/ethereum-lists/chains const networksMetadata = [ - { - chainId: 100, - networkId: 100, - name: 'GEN-X Testnet', - chain: 'GEN-X', - rpc: ['https://rpc.genx.minimal-gaia-x.eu'], - faucets: [], - nativeCurrency: { - name: 'GX', - symbol: 'GX', - decimals: 18 - }, - infoURL: 'https://docs.genx.minimal-gaia-x.eu', - shortName: 'GEN-X', - explorers: [ - { - name: 'GEN-X Testnet Explorer', - url: 'https://explorer.genx.pontus-x.eu', - standard: '' - } - ] - }, { chainId: 32456, networkId: 32456, diff --git a/package.json b/package.json index 8dea769e..7f2d3b70 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ "type-check": "tsc --noEmit", "postinstall": "husky install && npm run copy:address", "copy:address": "node scripts/copy-addresses.js", - "codegen:apollo": "apollo client:codegen --endpoint=https://subgraph.dev.pontus-x.eu/subgraphs/name/oceanprotocol/ocean-subgraph --target typescript --tsFileExtension=d.ts --outputFlat src/@types/subgraph/", + "codegen:apollo": "apollo client:codegen --endpoint=https://subgraph.test.pontus-x.eu/subgraphs/name/oceanprotocol/ocean-subgraph --target typescript --tsFileExtension=d.ts --outputFlat src/@types/subgraph/", "storybook": "cross-env NODE_ENV=test start-storybook -p 6006 --quiet", "storybook:build": "cross-env NODE_ENV=test build-storybook" }, diff --git a/pontusxAddresses.json b/pontusxAddresses.json new file mode 100644 index 00000000..f061ce02 --- /dev/null +++ b/pontusxAddresses.json @@ -0,0 +1,647 @@ +{ + "0x28080F654eED6CC00e8b16F4841E92CD0c2C0778": "deltaDAO AG", + "0x628677D9A9d93a913182fa04893Da0ce4E6570Ee": "deltaDAO AG", + "0xf8A493af0e72C2C62651Bf7b7d1a006806Fb646f": "deltaDAO AG", + "0xf5b1E6f9a566E20de35d0C240D47F9cc08f33c0F": "deltaDAO AG", + "0x50499814AE402563b5c34F6BD2F5C829A7693964": "deltaDAO AG", + "0x04863f1E29Ea1aBF006fB1ecB129cAD892db0C90": "deltaDAO AG", + "0xdA9ED09a94B1A2315e22157d75fd0b0bfC63B6Cc": "deltaDAO AG", + "0x7AF6c5F0950A37b7C25da4367E9B56C03dE8234D": "deltaDAO AG", + "0xC0E3B447c1e7B22769952E89389Ef2cD9B812Cc5": "deltaDAO AG", + "0xBf252dD5b3a31A50Db34113e12517b21D143AC52": "deltaDAO AG", + "0x0bd21cF4Da78f74c483a1109ac3A30794FBd556B": "deltaDAO AG", + "0x9c26685b6E8e2997d9aAf3f1a642f1b1b3dB9580": "deltaDAO AG", + "0xd0ea08826FA10eEaA3871a6AE680E5f15149F355": "deltaDAO AG", + "0x4C84a36fCDb7Bc750294A7f3B5ad5CA8F74C4A52": "deltaDAO AG", + "0x68C24FA5b2319C81b34f248d1f928601D2E5246B": "deltaDAO AG", + "0x2859d961a6dBa6e7d30b2d383Af468edb4E7F4f6": "deltaDAO AG", + "0xaBaf56FC1bB6b4FF9fA4378C3C8723d2B2444324": "deltaDAO AG", + "0x0a7B96885b28deDE4a6887CA1150E36edb385BeE": "deltaDAO AG", + "0xDF1c35c3d5178e9d98043b35a6737Bd861c191c9": "deltaDAO AG", + "0x01e66950353400E93AEe7F041C0303103E2ef5Ab": "deltaDAO AG", + "0x862E3fe199723945a38871dE4F736f1233589CE5": "deltaDAO AG", + "0xFDC7BEc0aED8a584577fd59CbF56805eE8c976B3": "deltaDAO AG", + "0x5f525cd29377DC2155C2AbCDaC0Ce45e630318b7": "deltaDAO AG", + "0x3a69B365769a9dAb67865Ca5530c4B1D5259bCb7": "deltaDAO AG", + "0x97870c129abc9877b66534e49f152585D6Ca3655": "deltaDAO AG", + "0x1Ad061ad839f82C05767dACd2B5ab384E72B45a5": "deltaDAO AG", + "0xFd4b5ae43f2aA446b02209098438890d3998cC9F": "deltaDAO AG", + "0x732BF4fA8E57200621b0e1acbe8855c238823016": "deltaDAO AG", + "0xa76Fa6837A6ffc9F123F2193717A5965c68B0cbA": "deltaDAO AG", + "0xFaeb57c16D5E9A9f06c8c5dB12796f5a432Eb7d6": "deltaDAO AG", + "0xb501FDaad0F0863C4c72f7EB9Abc23965DCa973d": "deltaDAO AG", + "0x3dB4E0b1fC6072271BF51e9a0CC17E3c7C4C99f5": "deltaDAO AG", + "0xe2DD09d719Da89e5a3D0F2549c7E24566e947260": "deltaDAO AG", + "0x1072D3287A5cC513F40b425735E04355487f5F57": "deltaDAO AG", + "0x26818079Ba707b2facFfcdc41445322f0e7e3042": "deltaDAO AG", + "0x18aa7C29527E71b9F295f1bfB63e57F5a0A97282": "deltaDAO AG", + "0x8d4198E9af22863d4269dDA6a41eF2BfA187AbAc": "deltaDAO AG", + "0xb4026ac3562245bB0DAb9205D698Ab0410e3d723": "deltaDAO AG", + "0x24D68bFBA0fB06ccFfD21dC3a5c0B65207Bd479a": "deltaDAO AG", + "0xa51815143e6C578D3c27A7b6fA6E4C1Dfcac555C": "deltaDAO AG", + "0x6432956a98E522F1B8a73a45245a5C6ff2c7f8f1": "deltaDAO AG", + "0xD1Cb3E73a7bC632d2279114AA2783dcaD06517ca": "deltaDAO AG", + "0xAEC291E9Eb4293d45a5B8aBE3549c0C7464e5C24": "deltaDAO AG", + "0x4c7BfE3D6278eb996FC13c5f748bC7b1dBe593D8": "deltaDAO AG", + "0x4A806a4851472F7cFd579d3FF5465F03c3c2B5d4": "PTW - TU Darmstadt", + "0x21CF19e1FaF3A62f82B432f82152e8c5C0FdBdaF": "PTW - TU Darmstadt", + "0x9f4ceE0eBD03a1e9E4DcffaF876873d7a3e9595c": "AMIDS", + "0x6E7bec8715955B6Cc90A5A1767cd981b90C5a245": "PTW - TU Darmstadt", + "0x81336c245712DbF0E971de5463173bCaA9826d84": "IONOS Cloud", + "0x56eA3Cc92144Db3bA2bdE25131F40c7B98F7eD32": "Exoscale", + "0x9Dc6aDA184fc98012D74F1C4f3f223183A4745D4": "Wobcom", + "0x0337b320DEfAddd9aDbC518f8A9cee30b606d15b": "Arsys", + "0xD7b90d6476091F6bc4CAaC40180FB300351fAb9F": "Arsys", + "0xF20113edd04d98A64AD2A003B836677E1c9aACAD": "State Library of Berlin", + "0x0279F7D611e8745BA16A4F1e83B752f8fc173870": "State Library of Berlin", + "0x6B33b4Cc1CAa5b49bB2752D23B9B78e524e17654": "State Library of Berlin", + "0x23035d7E3cddc44b345eBF9DDDA2e1aaeCeeEeA1": "State Library of Berlin", + "0xb98B9304860Be2a90F86CFa738dbedEb6C6AdF98": "State Library of Berlin", + "0xE098a4DE67034a17b23CDfB7E81C49296361974F": "State Library of Berlin", + "0x67c39F79B1e5430104bCc4009A6210EAeB2672Bf": "State Library of Berlin", + "0xEF193A800e956b9fF1c379B7Ac3C55FCA38aDB15": "State Library of Berlin", + "0x8337649C1d86ab41d42ef91E303B814f9FfEC04d": "State Library of Berlin", + "0xC309b5Cd4833315D495F8616A1B957E6c3F0Cc0b": "State Library of Berlin", + "0x04707912117fb09c68F48BDC15Cf78F50501fF92": "State Library of Berlin", + "0x92DCe2e6b29863CF190c520B81CB4153f2642a49": "State Library of Berlin", + "0xD274318C312174eb7CCe872eE415b7398c8dA2be": "State Library of Berlin", + "0x2E32B0e4e20C7A4162A6455b4A12e01D09472556": "State Library of Berlin", + "0x4d7fE037831F077583a259B6437E542EffD6f2cD": "State Library of Berlin", + "0xdf89102cDd2ccA60E88e480C6D609FB3bfFD4d54": "State Library of Berlin", + "0x62078F05Eb4450272D7E492F3660835826906822": "University of Lleida", + "0xa702032E187E6A53EAddC28a735B414220712689": "Software AG", + "0x0a477f6297413f20C4fBc15F93e34dacE4136123": "Software AG", + "0x586000e6DA330E140b11a4aeEbb81963d67F336b": "TU Wien", + "0x5c0bADfeEaE06699ABa04f465D1Fc360e6D38779": "TU Wien", + "0xBA87B2E7F71013Fe6561a877928EA265531B06d1": "TU Wien", + "0xf596D17C4a3A5c92c4721627B9e5E5064651BF46": "Materna SE", + "0xE90e1f337cBBaeD2bf30dD66165246e477F59158": "Materna SE", + "0x3CEA8fBCbD1c745E081fD3937C18eE0b6Cc3f1b1": "Airbus", + "0xF8dB4a6d529a14e3E029e2b8A9279f408909Fa20": "OHB", + "0x48535044200dAE3FD4f5b5C3f9b077fa5c230Ef3": "T-Systems Multimedia Solutions GmbH", + "0x212c355c3ce41a272606da61F661dDd2b7F8a4B1": "IKS - Gesellschaft für Informations- und Kommunikationssysteme mbH", + "0x44C34FbBB727bDC648E65feCfF3FB9D4c85f1fe4": "msg David GmbH", + "0x8fBF860883BB71D691053A4363030Dc1c65f7017": "Detecon", + "0x7DF1674a1e3449778eEB324652d3FF3Cb5046753": "SINTEF", + "0xe3Df4851c094f5F6F1AC9AbfA4FC2075276195Ec": "Peaq", + "0xB21282F443EB0D490819d98F2976758af5C979B3": "Datarella", + "0x0aec046a558F13Ff18aAEc5E6f76084185358cdf": "Datarella", + "0x6fE8aD445AD86b3d1325F79955Ef28d6e9cb2258": "Robert Bosch GmbH", + "0x51Decd187744bCfAD1BAb0A3E71dD68fAC0ba478": "TU Dortmund", + "0xa98A6eefbAE870b88a9C7A43f4b50066A01c93b6": "RWS", + "0x9dfbda23b65efB1c836828D74a96eB8528A60f3C": "Craftworks", + "0xb2AF8b92bFaC5299Cb6EDEf16150BFD1d4d26a93": "Concircle Österreich GmbH", + "0x2b92BF0496B7B41ea2d723325DDE96651795c784": "DENSO AUTOMOTIVE Deutschland GmbH", + "0xe761F8e33c71D08A9323Cb2c711aB4Fae2634276": "DENSO AUTOMOTIVE Deutschland GmbH", + "0x895975869261A215813e33568a295F94A3F301ed": "Struggle Creative Oy", + "0xDa4fc9E82Ac4E44207a1f74137493D3437D80761": "Sphereon", + "0xfc739f2F91921eb710878ad2Ca38C147a784C96f": "Austrian Institute of Technology", + "0xF62bF6371Ee020Cb2164Ac3C338514DBbb93A0D4": "acatech", + "0x6E1cE3530A12F89cF567788C132454E5dC7D3cCE": "Spanish Ministry of Economic Affairs and Digital Transformation", + "0x943CaA8afCAdd2F64a7cE9E53A91d5ea0BEb40c1": "Eviden Germany GmbH", + "0x7A6246e02B2aA276203469Cfb839a2666520D8b5": "Eviden Germany GmbH", + "0x9391291b0Df512B20810183744De8272774b6655": "TU Delft", + "0x2ee3c4F19f90237B7C45cfAD6B5dC4b5840563Ec": "Perpetuum Progress GmbH", + "0x203C7AA993EED06932FA327a192de9A8370b5Ab4": "Mercedes-Benz Singapore Pte. Ltd.", + "0x4d6240C7Ef355a2E85c13B26A49A35908ce853E5": "Mercedes-Benz Singapore Pte. Ltd.", + "0x2E33C6014222A47585605F8379a1877eaaF0ec13": "Mercedes-Benz Singapore Pte. Ltd.", + "0x6bF77769e84045a9EAC64573e70a5562457C52ad": "Höchstleistungsrechenzentrum Stuttgart (HLRS)", + "0x17c8D253443F9E7305A2539d7aF177B21aAD3355": "Ruhr-Universität Bochum", + "0xFDF411B7A23182e7F0a635bdF0d25f0fCb2aAf74": "north.io GmbH", + "0x3560626F234eD181E807E4e31ded56D9aca1ac58": "CONTACT Software GmbH", + "0xF0926FbE8e60E54aFB4fD296B2698230ab32799b": "Universität Siegen", + "0xAA782a260Ad773bca5Ff0535356CB0F7B94Cd254": "AWS-Institut für digitale Produkte und Prozesse gGmbH", + "0x2aC6802160A74677B7cEC1aaD7E41Ec968D57896": "5D Institut GmbH", + "0xFd1BEC7E551fAeA6102045D720dD693c4e9C8E06": "Accenture", + "0xa2199E3f60fC244037Efd5A77714CC05F604F855": "Airbus Defence and Space GmbH", + "0x5101ea56E29f5dc03285809b6157f0588ff255D0": "Bernard Technologies GmbH", + "0x8B7f2b75B7F87D3125C8B0eDB85639B441BBcE21": "Deutsches Forschungszentrum für Künstliche Intelligenz GmbH", + "0xb11124Dfa40E44b3283068fd07bf6FdE60caf06A": "Hochschule für angewandte Wissenschaften Kempten", + "0x632460b14aDd90aD9430e381B4662779cC1ab7a6": "Fraunhofer-Institut für Graphische Datenverarbeitung IGD", + "0x1f65110b63B6044f1E92543C09231842131798C7": "52°North GmbH", + "0xDFa29AE20eac7f203DdDbe15E1830985e99143B8": "TrueOcean GmbH", + "0xFfA05d656465568BE83B11bf274c5458AC8401AC": "Institute for Language and Speech Processing", + "0xb500BfE3d89b5D6b0d2b91841c3A3aD568Cb0FdC": "Vicomtech", + "0x8BF36BEFC22a7b9c1a546139bFd4ae8420bcFf0e": "Fraunhofer IAIS", + "0x2dB30B996C0E2990F836685Cf1A2939b3299f8e5": "Berger Holding GmbH & Co. KG", + "0x224482ebcf914b9FA9E312036B377e26B676E534": "Christoph Kroschke GmbH", + "0xD580c01E2f503287006138a94eBBc537Fe7eBD25": "Brinkhaus GmbH", + "0x4B107057aB8278c7d9436bf76230d16e5F7BaD16": "Gühring KG", + "0x7bf493b142AB0bb37c7f766A1585245901891685": "Fraunhofer-Institut für Werkzeugmaschinen und Umformtechnik IWU", + "0x1c0c9211E8Ec8E0253A53880D5481e4580B62125": "imc information multimedia communication AG", + "0xEEe803bEFd2B4f229E57523Edb11CDE38DD1a23E": "SAP Fioneer GmbH", + "0xb828bA1850aA11daA1890896573Aa6008221A671": "NT Neue Technologie AG", + "0x005d24698bF41c398ECF15a93455621932a6e19F": "IONOS SE", + "0x746d4715c24fc4d26D02A558ACF98dC717C68E1e": "ScopeSET GmbH", + "0x1Bf21DCb771Aba18B1D23AA6D8a619C1AB1811a4": "RIB Software GmbH", + "0x04FEA446847c3539d35Cca0a74Cb82Da811BAfc3": "msg DAVID GmbH", + "0x69bF63B2Bb6A93fc4ff434595A72a4ED313E5698": "Arvato Systems GmbH", + "0xEdfd506dd449Cd06c91f51Fe9DfE4e3E57B2F8f5": "Fraunhofer-Institut für Produktionsanlagen und Konstruktionstechnik", + "0x0763BfBcBfA0126b5A5509fB1185b7b6476BdAd8": "OSISM GmbH", + "0x54d2946677CC16E06Efd6161A4abFA17fc98Afc3": "Netcompany-Intrasoft S.A.", + "0x5880C2C30C922FE700fc079e1b6BBa7e9E7DE577": "Stackable GmbH", + "0xc2350eA5913511A95c1aBED51de377A0b92846Be": "FZI Forschungszentrum Informatik", + "0x0c85Cd08E6643Fa3E4B75268431d19CcFC99C916": "ProCarement GmbH", + "0x1153265057782e8C57292CA590E50acC36037204": "Hochschule Furtwangen University (HFU)", + "0xF211efa0C51559e6730db3Ba6FE1f1D46A68BE14": "Daten-Kompetenzzentrum Städte und Regionen DKSR GmbH", + "0x7209bd8fDd841358a3CF9E7DaD8D9dCe2E4BbBB8": "GMN Paul Müller Industrie GmbH & Co. KG", + "0xDB5807EacA2937f6264c5725538f8Ec357b4d3b2": "Fraunhofer-Institut für Offene Kommunikationssysteme FOKUS", + "0x8482256AC35fcA568a53CfD77Af9538FEC0691bb": "Bechtle Aktiengesellschaft", + "0x985f314171DFc0Ec3443E32b262c3135E094eD72": "Bundesdruckerei Gruppe GmbH", + "0x99c030936B5E7381E65B645d3762A93147EB15F7": "Fraunhofer IOSB", + "0x7104a77Ca5FfC6D3f0840048C307d05EA3b529C0": "embeteco GmbH & Co. KG", + "0x9c373e9f125497281f37AeF603fa99572856Bc38": "T-Systems International GmbH", + "0x8FAF0702C51c94b5848774129047d75cEe49EE87": "IPROconsult GmbH", + "0x3EAbA16E4Ac451D85839A42eb9e7C61F157C88b7": "Elektra Solar GmbH", + "0x1c99F7C29EE0e79CAAD8E4d0Cc0b95D5Ece62294": "Setlabs Research", + "0xb9C596E9eC598a865b51f3F53ae7d122B7b7a937": "Schüßler-Plan Digital GmbH", + "0xb7cF56a08F2B6ccF250B431125850968b7f6a950": "Data Machine Intelligence Solutions GmbH", + "0x4476123c4B4706cf88CbfA055b72726Baa1e8041": "Deutsches Zentrum für Luft- und Raumfahrt e. V. (DLR)", + "0x9309Ce467475DbB0a9c549B988F6571EB024507C": "OHB System AG", + "0xb51d556E910Dd1887602034bbB66DA63EaA80ce2": "C&S Computer und Software GmbH", + "0x007dB3DC8De9ae0F8AfeeBf1f7C92CcbD1A75Fd7": "eco - Verband der Internetwirtschaft e.V.", + "0xe70bBA7bC033Bf1Ce6Fa3328eCFAAc8966E66966": "Institut für Automation und Kommunikation e. V.", + "0xE4EE92b3a6B661b7148305Fa3A8d96062CBFAFc5": "Fujitsu Services GmbH", + "0x37e01308d6A0E322dECc457a13E0B2b2086D84B1": "RADIUSMEDIA KG", + "0x9Adf8e343ec1C7dB2B44e420bB8F4Cc51dEbFb7a": "ahu GmbH Wasser Boden Geomatik", + "0xE64872A181F0695DA0660fE0B809a89A3bA359AA": "Hochschule Offenburg (HSO)", + "0x533d456D3D5c16E6390647E2167678b7a76A4840": "FeltLabs", + "0x56e194D46fF305560f51D06cE84649C1DD91d2F8": "FeltLabs", + "0x61DB12d8b636Cb49ea09eCa58a893dA9480E1F33": "BigchainDB GmbH", + "0xC8a08b33995594bfdB0ef9c18EB72da0469E396F": "Deal ex Machina", + "0x289Ff19C1e544B6E9488d5E79966491A2bAa88C9": "Deloitte", + "0x2650e382770A04bE0f7E362ed578FB261A60F4b3": "3D Mapping Solutions GmbH", + "0x172b3eB3BDa62e81c171d340eC4a8C70f3d044EF": "Vodafone Group Services Limited", + "0xf1F30d7048775F02139Be30067e984F2C2d1812a": "Vodafone Group Services Limited", + "0xc21854fC5B997afa00c75b5098842a61F6E18e5B": "Feuerwehr Braunschweig", + "0x3561F6126Ce77A98fdC09DA2815919d5E04879D5": "Airbus Defense and Space GmbH", + "0xaDD9344fc33530dE1F2fb338de4Cf25f7d8a6E92": "Airbus Defense and Space GmbH", + "0xD9d17aC4b23222D0F9055723127acCaeeE834AD7": "Airbus Defense and Space GmbH", + "0x81c337F4a5113E30919F588F178a361ade1D1Be2": "ZARM Technik AG", + "0xA38E2b6fFf3d9c66270253c7fE4Dcb5B088020D5": "htw Saar", + "0x3BB6944351d156fAF798f952C2838ef5bac68E40": "Centre de Visió per Computador (CVC)", + "0xC09c6A1d5538E7ed135d6146241c8da11e92130B": "Freie und Hansestadt Hamburg", + "0xA933f297ca605434850419951685ACeEcE2Bc88e": "IGH Infotec AG", + "0xd1E02B17524C53B337C22BF9D414bc15f933C3f0": "itemis AG", + "0x4DdaE8989871DB4fAB65d62775e20c577340F8bE": "inovex GmbH", + "0xAaeA7A824cffffFFf9Dd6EC51D7D7B0abA3f205F": "neusta aerospace GmbH", + "0xf9eaebd346E9D414f4D4210CB12e43cc226038cF": "DLR GfR mbH", + "0xdbe749D939ea958aC64A5bdf163B05096E260572": "Valispace GmbH", + "0xAE823B7a6ad5b79da6d180Dbe91E7C810abAcCA4": "grandcentrix GmbH", + "0x2B9C7E0d7Be68ec6b519Dad050CD0A4bf130B6A4": "DIO", + "0x8e8D96aD41025EAFE3D4C198afca6c1eb5EB7a32": "SSC-Services GmbH", + "0x689aB080FeF2e5D7C3e434E4f383d0Cf266F5F26": "enviroCar-01", + "0xdd0a0278f6BAF167999ccd8Aa6C11A9e2fA37F0a": "Approve EUROe", + "0xdCa2bf6c67d7ffc8003B62bE3517b45506Ca2950": "XAsia Probability Data", + "0x90A5C7b01A19D451056086789b7932bfd393EADC": "XAsia Probability", + "0x952D30877699598e10fCAF57D1728d1D08cCf626": "OCR Test 1", + "0xF9be108f1e6D1C053273b87f6eE1cb6B6AdCf615": "XAsia Data", + "0x744a5B098dbf7FD7c4326F9424C29Fdd63921f97": "XAsia Analysis", + "0x5C2867c3862cC9fA134fE3441354A877262b4D63": "Digital PMO", + "0x629A5175d4ee48AC7F9F4b05F92B9714d38C445a": "Detect Software", + "0xf2204753Cbf117622900Ac62eA97Fd5FE1c5855A": "Defect Imageset 1 v2", + "0xef0E7512F7AF5d4254eA39c7295D411bb3b73321": "CO2 Estimate", + "0xe6b1b66E6f2610B76e92aF9EEeE94a3a153fb733": "EuProGigant 820C", + "0x4FD0745e945AE67FDbbD2935d8F434c0cc3331f7": "EuProGigant 821C", + "0xD73b05792607dB02C7d5b280C8cc51D1F5cB0aeB": "EuProGigant 824C", + "0xCBb032a8E5862981eFfCD8883cdf3871e58BC124": "EuProGigant 829C", + "0x7a79678fB31C855B382797e029b7f517a6B581A1": "EuProGigant 830C", + "0x59Ba45B05F68b95B57e69D0d391aF732B3c241a0": "EuProGigant 844C", + "0x269D6c8c3741c86B318493c41F186994956B8dd8": "EuProGigant 846C", + "0x401fABA45ad4D66095Ad394f701499B920392308": "EuProGigant 847C", + "0x7210fA5f4F82b66564181699C8Cb09A1FdD7D474": "EuProGigant 848C", + "0x06815Dc89b8d804935447abB3EcF78e588ED4FeD": "EuProGigant 849C", + "0x94E6892daBBb49373199744eE694CbC6128c4a16": "EuProGigant 850C", + "0x83565B4fD5C24aa8075671BeC7d6463baa7D6554": "EuProGigant 851C", + "0x46B08D505195F4826797dC67D315dEfa77E08C92": "EuProGigant 853C", + "0x0A1d8040C1CCe0597586e5CB033737E12ad1F178": "EuProGigant 854C", + "0x5217fC46348C6404Ed45A06DFe38374263C6Dac1": "EuProGigant 855C", + "0xdDdB40FF8b2971EB7D87AFdFe189Ab814Dd36c88": "EuProGigant 856C", + "0x218F13bB2d52CE5B9Eaa440B923FC738e916706F": "EuProGigant 857C", + "0xbCd8c5eEC87bb67f61C0D7c61bd1e144667a97d7": "EuProGigant 858C", + "0x721c13C16914b1Dcc9f16Ca7F36443E3FF1f669d": "EuProGigant 880C", + "0x4800A8709656D23707260831552252C28D71B7A3": "EuProGigant 881C", + "0xA1C749aA0b77D129c181Cb7C7bDCB0D677AA5679": "EuProGigant 882C", + "0xbB340Bb7211AF5eE61DF181CAD3c46E5cce7C18B": "Map Service HH 01", + "0x085BD42cFf8a197866635F24200d34BEa2E562e7": "moveID RCM 02", + "0xE598D4f268253c933db79CdE21eed9ccd7C06AEA": "moveID RCM 01", + "0x4E0d0d9442036Ab25DD0318Ea14d1652b5e0B4Ff": "moveID Images 18", + "0x382045266FB802c261d9755E7724594753DD611d": "moveID Images 17", + "0xfe93047A10e4540977386004bF2863D4230639C2": "moveID Images 16", + "0xbEe092Bb89C7B167D6E63E952d15e53D3B08cA45": "moveID Images 15", + "0x998aB7f4d9620FD1DBBF12272435caE458D16e1A": "moveID Images 14", + "0x56163d00093bDdA803Cb826DBB563f4c5Bb2b1B2": "moveID Images 13", + "0x411b68263ece6f7179Eec3F537F4a1981d075ec0": "moveID Images 12", + "0x28FAf2743f21AA0EAE14a37A4daDF25E79f38AE0": "moveID Images 11", + "0x23E55F6DF3325ad0a2605d4930CBbBDd68CfAF51": "moveID Images 10", + "0x68a6a229c1485B68A759a9731983456364de5DAD": "moveID Images 9", + "0x16dD1FB1e55918dccd7fBa2525e764BB1Ee33a86": "moveID Images 8", + "0xf4C33572Ca1c9A06D3d1D92e601B3559c2E1A436": "moveID Images 7", + "0xc9EC083C3aaaAC367643F5C72F5003d4ccb67397": "moveID Images 6", + "0x0A5adb41901ac503fC2400B5a2e38c70A6CE86bd": "moveID Images 5", + "0xe8ecC6c91391854861EB55fa270C30E12Af4F1E4": "moveID Images 4", + "0xAcec258c049Bbf6955e25c84184ba38C54552a27": "moveID Images 3", + "0x2010bEEe740F4aE18d203Fc07cc8F5d92760eb76": "moveID Images 2", + "0x5bfa02EA01566a52593F6B218d95Cfd3Ac7b4A4b": "moveID Images 1", + "0x6C09c6561618E84052204Efdd1a5844a8EA2cAd5": "pro-micron GmbH", + "0x56289213416634216ff0BccF3671653863CE6aa1": "Goudappel BV", + "0x1E423FD6c2Ce13E34bF0dB8f0Ad5CCF372578C33": "Posedio", + "0xD7783c77A0bd22914872BEbdFa1c00204fF9Ec50": "Deal ex Machina SAS", + "0x3F820b9D0A310a3C689EbC425a5D864D31bFE454": "Nimbus Connected", + "0x25582EaCC369Fa9830394A78664337ED3eD7a367": "Secret Dummy", + "0x70adaBC2BbD139e64f06f2cf6d0e2180cb5E523a": "Zoning Service", + "0x8D8CBbf19b94e2C2B456AC218C5e833C9eA08b5e": "THL600 Spec.", + "0x707d9Cf07b2349315e87448A1C4A4B5092468287": "THL600 Spec.", + "0xAeb4A2bE7Eb32Ce51A64d75AD00DBfb7E05966a4": "Sun Sensor v1", + "0x6044e53f7Aaf1fA456cD7461143657f3c53CeCe1": "GPS v2", + "0x7Ef230b905927Bf5aD7610894Da728f85C828faB": "Gyroscope v1", + "0x2678228892CE9c15382BC8F38911e4098f8c131C": "Magnetometer v3", + "0x3D308451D0eE3B1E1c6c2b24f3722A09331C566E": "Magnettorquer v1", + "0x5c87001e824910bFd22F216150413C8EB52e7c4a": "Reaction v2", + "0x0f788f429950fa70961297227B0669109f0Ab5B7": "Star_Tracker v2", + "0x5144012b36Ff713448b9D11CA9aC75f00CD143CC": "Star_Tracker v3", + "0xA2cd83A9a9779d8434927843247ee685A1e03a7A": "Star_Tracker v4", + "0x60115cc83fc5a44D37bA6c4C1a25323019e255A1": "Star_Tracker v5", + "0x539158e4bdCf966E301881fcbfB6E88cB6491BEe": "HEATER v1", + "0x80126b685f0aB7358745Eccc1AB1376D6BdBB12f": "THERMISTOR_1K v2", + "0x5C5637268bd9fD28e365B7a492e8cF9e19da8f24": "TVL", + "0xc1dF3Cd04BE1159f1b6e27Dfa04a846FAbc959dc": "BEEBUCKET GmbH", + "0xd794CeB60d49755762C17bD7Cc5f613FE363b9F6": "Neoception GmbH", + "0x70aef11232114e64d8ff1bc1b77dcea0dfeb5af7": "Load Test 20", + "0x8019b807912f3fc1787f7f4c60200bbe3e0cea09": "Load Test 19", + "0x98efc94ada3397f1e8a36d5b393350f1c3b6da5b": "Load Test 18", + "0x09f012fd0e6d9d5be8b1c2e98e8a221b4bee121b": "Load Test 17", + "0x3d49b6ce1eb74b01c6ded0a275a22949e2726715": "Load Test 16", + "0xed7a18fdee06e3e4fb50e717567a357711615f09": "Load Test 15", + "0x9332c77c7cbddee7824bab4f20002e7aa716898e": "Load Test 14", + "0x0dfe520a6f548bf0688914b109055e77f39d7941": "Load Test 13", + "0x181aaaa8b8fa28b909b15e7d039e242410fdd526": "Load Test 12", + "0x32d5114ef59b0567865caa1110a6ce7369e886d4": "Load Test 11", + "0x6fcc2c7bec531289c47126c8113822788e147304": "Load Test 10", + "0xefe599c6fc93e83ecca15a6e22bf33372a0cab4f": "Load Test 09", + "0x35d8592f5b7c616442fc1053db23b582661b335f": "Load Test 08", + "0x53c25cd5cdb0bdb444f0b972622c43d5a1787476": "Load Test 07", + "0x9e8be5df26a1e2e5356118a54b40832aad3ea99d": "Load Test 06", + "0x8e7092d647648359ad504650e5555d7ff41c4476": "Load Test 05", + "0x5a2b79e232f205af2a6fbc20edadd2952b73fe8d": "Load Test 04", + "0xab10aaa8da79f5d1a126b98fe663024e38cc2d39": "Load Test 03", + "0x5460fccb858793ea5d176fedc6b46ed1a1f9e1ce": "Load Test 02", + "0x85ac41ef595ae19dfe7fa5c7fceb251fdcfce327": "Load Test 01", + "0x1B76F1026B29f4bBf18009E44fD069b8915B3960": "Load Tester 01", + "0x3307020Da97cE08e1B296042E99015bF99ad1D43": "Load Tester 02", + "0x772ff6cA16103de9ADC15faea85e68Ba87b885DE": "Load Tester 03", + "0x660B6D6b83cE812c8d2B977B5Ee216b89e10153c": "Load Tester 04", + "0xd7827e25Ab8aFF11C21a9B6655fD7a6CE304f912": "Load Tester 05", + "0x10b07F5D3ba056dF3afe94dCC29c446a59462fBe": "Load Tester 06", + "0x1Eb047444D65EAB14EcBd8d0c8d290CCF1D74480": "Load Tester 07", + "0x741F71533929bffB17d37830db3A1B88997D7936": "Load Tester 08", + "0xC7e1a8858760C09fe24b46dE0DFaEa7ee3CF8721": "Load Tester 09", + "0x27b7534b018ac11BD377f668546906C6aCD52c28": "Load Tester 10", + "0xC844DE2AF6b401B10Fe6f0733EfE2C98048b0C90": "Load Tester 11", + "0x87C1B399DDc7Ffdc2849672fd80600b2Fe1BE49a": "Load Tester 12", + "0x1057c71CF2932E7ceF4Fab53c42f974FA6462494": "Load Tester 13", + "0x1eC6c60332b676d9f81CB9DED9cC21CB4294cbFc": "Load Tester 14", + "0x80D70Ac246695E925ba32389d062041Ddc3b36b5": "Load Tester 15", + "0x3541901cF20E57cE127ca19960De4bB907FfBaB3": "Load Tester 16", + "0x77d48a2Ed620e9743eefcf9109BeaB361c21A7d5": "Load Tester 17", + "0x89974C9Bb0A2433afD4Ae8A11D189e7aAC1Cae9F": "Load Tester 18", + "0x7Cc6a9486AcCa9756a19504f9d3DD5E75C0c0850": "Load Tester 19", + "0x8e2dA7fc24D4b253F4829987240BF5FDC73550A3": "Load Tester 20", + "0xdA1177705EC8ac8AaCD222140031f4066faFD552": "Load Tester 21", + "0x7C052DED09B3275a5aCd0f7395886ec489bfD524": "Load Tester 22", + "0xe3426274150c4a0662D213f490ADb71015E5264F": "Load Tester 23", + "0x241C279Dc6cDd323d4Ea7c9eb6523bEDaCeC32E9": "Load Tester 24", + "0x2C8909E9F06e35a0f5E30Ee4864ba5B9d69bb2FD": "Load Tester 25", + "0x083C0EeE08e5A2604cEb685e44e292825A22bD99": "Load Tester 26", + "0x1A9eB6f22907fDF82885EF317691D5a736c3b26c": "Load Tester 27", + "0x28c816efb4caDeF6871f87AfF80E968105FEb534": "Load Tester 28", + "0x997a77423aA7E94461255A0ADA92B042Da96A4F4": "Load Tester 29", + "0x4342df26FFA55043E90Aac6459c56f1f19955d09": "Load Tester 30", + "0x5Dd4b45b0209bB093AA4e2555255ee099f168eE8": "Load Tester 31", + "0x04c787818F35922475561C6E89eFcD98e2c662d0": "Load Tester 32", + "0x2f56Cb0560bf75c56395a26DcC7359a5FFCA579b": "Load Tester 33", + "0x8256d95B16170E60b3f0f43dA671F3F65Ca8e6ef": "Load Tester 34", + "0xf447B099fe1436649BE6243d0D47A938373D0828": "Load Tester 35", + "0x7f849F47aC00B4c28CB6F40E3E2fe5fD611E6818": "Load Tester 36", + "0x1CA2D65f5E77ebDb01cf07C100cddC076c07e50A": "Load Tester 37", + "0x817b569b9907b193fFc3EB6398F5f2d44681f8ab": "Load Tester 38", + "0x7c537c0ef735eFAA0BffA8FC6e1A1c6384674745": "Load Tester 39", + "0x8c01fa36a7792950F567B386C3f8e57C10C45798": "Load Tester 40", + "0xBdb3D87390F841126b1dbE7424c62b22537418c0": "Load Tester 41", + "0xd1E1B335666acCBd5b29b38B3fB3D804D0A92082": "Load Tester 42", + "0xBd06EeA98B715a4479D2431E9C466E72466F6863": "Load Tester 43", + "0x6828038D66f0151E2b77808DFb5Ee85033dEC989": "Load Tester 44", + "0xD9ff7196baAAf1D789937A09FbD48629fba5FDD5": "Load Tester 45", + "0xCD5Bb8bDAD37D66a210C9DDDCD048405AA56659a": "Load Tester 46", + "0x8b93Ee1bF059CEDbc2804CC2600DFcaF18D22885": "Load Tester 47", + "0x9C7Bb07F78282c94A41Df6957762a25fFE9C537f": "Load Tester 48", + "0x3B89Dc71d8f672dEaE93aDf1285eBd08fDf44244": "Load Tester 49", + "0x858783462412A54A7ad9F163d70D0cC801bc7e16": "Load Tester 50", + "0xdDc76C84745D49635e6c39e49D18CeF9DB195122": "Load Tester 51", + "0x2C1605e60e3019fa5FdF70f0715d6fCaab7cFec7": "Load Tester 52", + "0xB1267700D5F30DE00772342E67A827A1203307bB": "Load Tester 53", + "0x26Eb315Ec8fe49fcFF9D633e2a8d40d8F32fc796": "Load Tester 54", + "0x8dD9Cc8d55d2e6691b9e2B7949A122299D5cE705": "Load Tester 55", + "0x42126600ce103CEe55e014fa2202006501cCe353": "Load Tester 56", + "0xD6DDAacac332ae83294Eb6829E8A4a528AF4693e": "Load Tester 57", + "0x7EaaAf241dA677cF6228A760c6Dd9Ff320cc485e": "Load Tester 58", + "0xb88C670CFd5D394398EB67f9BfCa2412a4fA4551": "Load Tester 59", + "0x4C9608F75B1A1644beA371659a2f7855C9Cc9365": "Load Tester 60", + "0x62De34F259FE1DFA6D1f052112ec9311DB5970a2": "Load Tester 61", + "0xe73AD17E137D6c461023624a361dE73a4c4b44E2": "Load Tester 62", + "0x7F455c46E2C344D16a4f2b6B64e8B1F2e32efBB6": "Load Tester 63", + "0x5D295C73d81dc0007155cB747Bf8A64A764bE8a9": "Load Tester 64", + "0xFf9B9702E5793ffDD2bC96Cd0251A9762B5c478D": "Load Tester 65", + "0x49D8c57648d0D1BC7A171c7c750be0a2796bada2": "Load Tester 66", + "0x51FF3049B740069B0f6233F7bBBbfe2cEB421FEB": "Load Tester 67", + "0x778277990021B0491F1217FA2Ccc4988a932623C": "Load Tester 68", + "0xc66dF9a5e337a5544a8931e1F982A40281eCBaec": "Load Tester 69", + "0x70A997Ac1e85a34a3bae65F493b13b72c56Db9f4": "Load Tester 70", + "0x59e41768E6a0cbDAD5Aea9ccE73708db58d60792": "Load Tester 71", + "0xA51837F0666722cB7f52632E771F4AA5cd88F2d0": "Load Tester 72", + "0x2f604877943F3DBb9d3a386e1624E6c678e4897c": "Load Tester 73", + "0x8c2a91C6ba92e113971C0c5EE1655CB216f3b0B3": "Load Tester 74", + "0x9Dd1111588a9d738CF3547EF00C63130D17F5A76": "Load Tester 75", + "0xef5D4f89eE6e2741ceCB171e29d359F29b385daE": "Load Tester 76", + "0xB4DB1f7646Ce22Ed99A1677e849396F6ee61D856": "Load Tester 77", + "0xFca4005898f118d3dD09b50096b92CA8fb1d37d9": "Load Tester 78", + "0xFDEa5E54A8BD60f5950e150E5904C42De5F680EB": "Load Tester 79", + "0x32F50dcA56A707fE21D304Cee8A45c0B9F00faB4": "Load Tester 80", + "0xeca6894a723a6ECcf962Ed12B1e153E53a24Cda5": "Load Tester 81", + "0x6f6f82b38c405C0d271C46f7635beba2B4C93787": "Load Tester 82", + "0xC48caeDEaDFA66D0854E334d82BCF035397e807f": "Load Tester 83", + "0x2b3764709b5F0F2B172e0DCb8942cE46b9EBd367": "Load Tester 84", + "0x8FE39eE8ef9BdD91A2C8667C5139c022b35cF7A0": "Load Tester 85", + "0x6B95a0c4a5c8775d9Ee5b2d35429Ca2bBE7630Fd": "Load Tester 86", + "0x66Bd91B858d09e6f379A39d12c39F3088570f051": "Load Tester 87", + "0x9667370A147F286bDE86f61E7fCeFb6d6e8921B4": "Load Tester 88", + "0xf64B9bc55d207E02f5227fEc9F7cDa96C1195E3b": "Load Tester 89", + "0x65b3E81e6F6a967a3830e137247AfeFF16D795c2": "Load Tester 90", + "0x8F8084597Fc6A850bEf4c3dC772067d6B41a89aD": "Load Tester 91", + "0xA4fa9712B4F1b024fda22B37e82537eC3a21C311": "Load Tester 92", + "0x42E6ABd191a9292115bdc09930d29614331A8c65": "Load Tester 93", + "0x7973639DD3e769dFE6735825676BFA1C1c552606": "Load Tester 94", + "0x669a27ba1C63E9633340282a46FFb2b70cDC8Fb1": "Load Tester 95", + "0x123Ddc4C53722EA57A0c664767d0Ed13aEbB4Fd2": "Load Tester 96", + "0x2BB61F51Fa3E4062eFC74119D429fdc5F9118E84": "Load Tester 97", + "0xf23Ce790658A0C29bAa59A6B36e0c14BFc32461F": "Load Tester 98", + "0x88e3f14684BC12c97dB86440ac0Ec855C7121e2e": "Load Tester 99", + "0x574631770FBe286C017698C53cD980A4D9685551": "Load Tester 100", + "0xd96F92fc501bbF5aB3A0C8ddC910FC74bAD1CAdC": "Load Tester 101", + "0xDE7Dab8354E7f438555606c8Dbf4F51BCD8EF0bf": "Load Tester 102", + "0x496c69783A5B2148EF5459C6F0eaE7B536D004D5": "Load Tester 103", + "0x3703738B4781b70930F0Bc0af07662D82F0D1e97": "Load Tester 104", + "0x9cdA1740B30Fe10F54967aCB516235593AFAa51e": "Load Tester 105", + "0xEa4164e9cC1Afd8814FB12F4Cb9a2738ebac2F73": "Load Tester 106", + "0x7cAc1431eCb9C579Af08f7c3a5c02c28CEC99c54": "Load Tester 107", + "0x8a7F98F273A1FAbd434F73A5928CbD47777aE493": "Load Tester 108", + "0xB7163e5DCbB1Ab25dAe18Eb54f3603A686B523A0": "Load Tester 109", + "0x87c32c2918f13a05cCF249DD82c305a46Fc1D9Ed": "Load Tester 110", + "0xe9F676c7601eE857aA4BCBeDA98160FA71B7b33F": "Load Tester 111", + "0x5F35ea7688ADa03Fb1a6d92A37044b39162B2B9d": "Load Tester 112", + "0x02282Eb07e557316C4fbCa7f4Cea79C6013EA4E3": "Load Tester 113", + "0xBf006A1F68478a9DED116D1D572294F7EC63413C": "Load Tester 114", + "0x560D3dbe51D73139d135dF9DC033163A4491E1e0": "Load Tester 115", + "0x35312e08473b68C442438B2e382F4F56AF21F320": "Load Tester 116", + "0xCb3541Ad275c5FB456A377d210267aD462e472dD": "Load Tester 117", + "0x62efA4b9FF22A62f3bb2300dBC344c1e9002bA58": "Load Tester 118", + "0x7D35076F2A39C1ff772385eCBbe0e772e3A1287C": "Load Tester 119", + "0x8dB5a7A91c706180fC7d39FAf1e353d2F069620E": "Load Tester 120", + "0x571A95AfC59D37F68B507a8c77f977AFD6BDcA09": "Load Tester 121", + "0x27Bd063E8e3EA4a806C1527d804bAdFda14869b5": "Load Tester 122", + "0x2988495d8054451c48D598c124b8D6cd7BD4B252": "Load Tester 123", + "0x0189DfF4F7682080446202D7B3ac7652a658e8A5": "Load Tester 124", + "0x5024D56F4AcA6434735be71e11Bd9FB18E31E9EE": "Load Tester 125", + "0x0CeB858724433d846cB0F976081026EcE4B6aD78": "Load Tester 126", + "0x97687688De3De19dD1bDCDE8925d87012dB59F05": "Load Tester 127", + "0xA9c9379178C91c33F3eB6060F819fdc93a36Ddb1": "Load Tester 128", + "0x8806f8d4B885136Ba84224DbB69314cC84eda334": "Load Tester 129", + "0xAEE34DF14149Da710D49819D22b9eAd3bCcc2551": "Load Tester 130", + "0x418788125ED5316E3451429f4a93C46806F838A8": "Load Tester 131", + "0x4E71939dD8862b996Bc3ed2Cd88b26B93b017421": "Load Tester 132", + "0xbF396f96be00701d9F49bC339f49dE6EAA53fCB0": "Load Tester 133", + "0xCc8ebdBE18fE6345c20F8CDF41d1491a2A3f7484": "Load Tester 134", + "0x2D5B985E8C7cc33C1Ce986fBBcab28Fb395B0663": "Load Tester 135", + "0xbb4034FCEefB6299f6DB1932D3088ca3b3005B9b": "Load Tester 136", + "0x4Ae7DabEc3fDB0B415c050d3a07116442173D8f0": "Load Tester 137", + "0x87b9Cfc32Cd8c736248D72d4cf15035eb5f67cf1": "Load Tester 138", + "0xb844Dc0B6dcD1E4CAb4ff812CB28F40CD98b8728": "Load Tester 139", + "0x339c6f1fa825469E75FE8A98a037cfC3701750c0": "Load Tester 140", + "0x141CAf354d32a55fe4b32f48383E8519d2AF13e8": "Load Tester 141", + "0x1d1619071D2ec40B928Af424baA2e5F1E1D55493": "Load Tester 142", + "0x3e26c4e9f358bD14AccFa25e1cd6f8a0b3A266F2": "Load Tester 143", + "0x8bb68a764A6d82100dB7337fD8d8826410D902e4": "Load Tester 144", + "0x5c0b569e971f6992851f8516bdfdA72b22114a62": "Load Tester 145", + "0x1b5D9eAf7d869Aa7279d952406f7B6F6F6CEE50A": "Load Tester 146", + "0xa50b5aDab2Ae16c571A4D475D72FBcD40870Df0C": "Load Tester 147", + "0xD5AB5Be323AB68E0e12F722917C68fab8150Ec24": "Load Tester 148", + "0x4ac041265092021217BC3aBA4B3C1aeCb4f254b9": "Load Tester 149", + "0x176df81DeEf6c6F98E7E9359D56d728db42Ce72C": "Load Tester 150", + "0xA12ffd0B9915ED28A1E1Bd61f6Eb18Bb5acA7D23": "Load Tester 151", + "0x97064466eaAfc6E9a7616AefE1490a0cc0a0453B": "Load Tester 152", + "0xFd36cD95b50A7A33fB294D6C659986B4Cd3CD2F9": "Load Tester 153", + "0xFd3B4924464eee00137Fcc7E3Edca3658D2e0Cf0": "Load Tester 154", + "0xD36230d583ad2e4e5528517beE67a854e72D3332": "Load Tester 155", + "0x3a2902EC36b9F602e216C64696280DecF6603a0C": "Load Tester 156", + "0x8A15e09329Eb9c3De48092ea9fB9D3a1FbDd2C8b": "Load Tester 157", + "0x293d7483b4e3A1cd53C00EAE4e0Dee122118B1dB": "Load Tester 158", + "0xb1c3d2A796Dd8f2e86c08ca0e9503Fd8A5dA22c7": "Load Tester 159", + "0xe4b776ca42e4acA267b3bB78343e2aeFBe3645B4": "Load Tester 160", + "0x60f006C15cA8C926182712852D5d0e5862EeB4C9": "LoadTest80", + "0xC46f467A760b692e28972b36ED4b5fFAb0fe49dE": "LoadTest79", + "0xafA3b2d6C082c46b02fd0F7F3047B8417F7aCc8f": "LoadTest78", + "0x2D13bB0F7C440aC139B83CF4df578266bc37f6C2": "LoadTest77", + "0x57Cb8672E1BdfbFcD04D4f9Ad66DA1322F692591": "LoadTest76", + "0x0eC0F058bab909a08f0B3225B6DcAF52E2caca4b": "LoadTest75", + "0x25Fe467357bc9351F1B3d7f2D7CE94920E4BEe23": "LoadTest74", + "0xbC8EA107b89fF4f7215e2290d6c80d36Aba1d74d": "LoadTest73", + "0xabB6ac396AF983fD337Ad357474efaAC634f609c": "LoadTest72", + "0xC637922373b0214F1b625BB591c7090F0763c901": "LoadTest71", + "0x62E2e3ecDB957cb185B3459ce0fDcc719E57d426": "LoadTest70", + "0xeb2e652778C26C4Be9c3CBb10C703b2bfcbCEB22": "LoadTest69", + "0xFb1F1653b922077F3c03c8eeD7490168A112912B": "LoadTest68", + "0x0Ad80025eFc915C7B94c2AaCc05E62db1113DB30": "LoadTest67", + "0x4B03C238321E00572dead9522C3639911e258935": "LoadTest66", + "0x65c87Aab20154aC2f487313aC4ED7f9E453B1212": "LoadTest65", + "0x14b2fCdfEF97314FF6CB51a98E6AE1080B8033B1": "LoadTest64", + "0x1385c37C2fBb77454095927C92912570d2fd07fE": "LoadTest63", + "0xF46f6e59E46D8E825B59d6b2Be823D931BC16465": "LoadTest62", + "0xEF1287D523eA5ea0E4C33a477856BecBDc854783": "LoadTest61", + "0xf35448810255FA38d52d38Ab1aE9B8CE169d5f70": "LoadTest60", + "0xB80479003af216e9bE54ed63ad9492D5692F9Eb3": "LoadTest59", + "0x4526d22D166dCC4Fa805d2e9BA926bFde8F7eF09": "LoadTest58", + "0xFd0A81352689571dD8d8D9337fAB59eC846f6092": "LoadTest57", + "0x244A9D06BB35d72879eaEa8ADd834B59d2cb4cC4": "LoadTest56", + "0xF32d13F21FC6090bDF830740FC9d9B1FcbCDd50b": "LoadTest55", + "0xae6b4263a399999943EeE81b96cbE063aeE21737": "LoadTest54", + "0x22faAb7EC46970Ee79E4AAf0dc31369ae77E7aCE": "LoadTest53", + "0x0dFc0121222a56934660B018cA2c5e648B1A4E9C": "LoadTest52", + "0x1B25dC7505626A4bD5D6ba86614520Bf52524D1a": "LoadTest51", + "0x91AC270Ba655bf3AF5f767e94AB6a2C9185B6A58": "LoadTest50", + "0x6649c5f0C8C796CF99B8B388685e2B4Ea92E1746": "LoadTest49", + "0x8627f4E450527B92C01Bc940CcAD7104B4b015C6": "LoadTest48", + "0x872f7a9f4C26f69F57C96E0Eb1b8B63483Af128d": "LoadTest47", + "0xeBe93614b9C098430aE7F31e176cB82B337Ea3bb": "LoadTest46", + "0xd578f55dA936F772b243e43bAF4385d79CEd917E": "LoadTest45", + "0xD679F3d868E238d5837fa9B209cC60160ff06F56": "LoadTest44", + "0x6d00174A0AFdb9C810a7e83F1D5A8C14F9aEbb8c": "LoadTest43", + "0xa81441f4867497745075C0E6D976eE7495b7D2a2": "LoadTest42", + "0x49D6A5FF500C7cF2C7BCbCffcefAf732D1AFd33b": "LoadTest41", + "0x0472ab131f68CD5038649CC766323a2D9835D322": "LoadTest40", + "0xe9F85257717c82a8E998bbbaCD28522ed1ed2b31": "LoadTest39", + "0x5722B3bfda9FB091870b9D0a982fd01A6Cb8eF6f": "LoadTest38", + "0xaEaBc49D0f5AE8158F11e34A517c471B73145760": "LoadTest37", + "0xD29dD5C78F4FAa2c79B9a208a5caFf348f4FC505": "LoadTest36", + "0x1cF31871628EA7B3F03D11fF76b2E9E6f998a3D4": "LoadTest35", + "0xc5eB3597466170F09117c8f692876513B99B4d9e": "LoadTest34", + "0xc4850BFD392c0d2a47c3575ca7564e8791349768": "LoadTest33", + "0xB3a51a289666Ad2fA55869F3cc5d70f8ceAD1331": "LoadTest32", + "0xF6871fc2b3c49cB88B16679a61d3fE73FAc7770D": "LoadTest31", + "0xCf591DE9621CE0259c182aAA15Df785fCc60A454": "LoadTest30", + "0xf9C63D730B195Dd1a6Cc464BFc8102f117808c93": "LoadTest29", + "0xA6f7753ef5b09379afF441c10a44B2178CD3D288": "LoadTest28", + "0x77E09cF9Ec978dc94202A2Ea839A18b326A5cbe4": "LoadTest27", + "0x39f887FD35F445DF074BfF8F5d318f40be168ec6": "LoadTest26", + "0x920C76f64f9aF922D09eEF6cAF1fd2d6B9B5889e": "LoadTest25", + "0xD4F55F8AF3d5d57e79dAb8E8Cf72Cd3cf5Bd49A5": "LoadTest24", + "0x51e6Cc8267fC09DCa613765D535D50730db6F9d0": "LoadTest23", + "0x7403887426Abd1D18bE053f45F5ddAefC7b7B9Bf": "LoadTest22", + "0xC83328eE9d828cA3191643FEbF80a7382d173060": "LoadTest21", + "0xEa1352fF39b456d3a2f686397Aa7cF0c99A0c9f1": "LoadTest80", + "0x7ce440F5186Ab1f847b3476Eff5a00A08d33e807": "LoadTest79", + "0x4ce31C3ace03EBE84388d91385ACb07dEFB5c647": "LoadTest78", + "0xb2C9b05cB07CEfEEa67C727AdC05dC32Ba7Fb5be": "LoadTest77", + "0x40e3F47822D0827d658054c7310957b8Fdda7a0c": "LoadTest76", + "0xFA421A133807afFec30d7bCF47284666Ae7f5E65": "LoadTest75", + "0x4d236E7706F1f4A4F1485D57AFe267c64455fCD8": "LoadTest74", + "0x005A42D80C0412Ef70b851AAf34D288A6bdfC33D": "LoadTest73", + "0x9AF6ED1442DCE73CB90040585BAF69Aa34975BE9": "LoadTest72", + "0xf10Ec2c7C0F425Aff347A3bDc39C1432cBB3669c": "LoadTest71", + "0xCbD1cCf7B8430143250F506daee2f3B79eD654A7": "LoadTest70", + "0x7101e724ef79B0A6D4ef84b4D22377d251DDc6b6": "LoadTest69", + "0x0d854416429bfebcdB1528D2ea1dD43C59242b91": "LoadTest68", + "0x3EC97Bf02df2808E09039Fff150845FCec1CFA56": "LoadTest67", + "0x30454f61F66651A765572f6a3F2BF931F3CBcd6f": "LoadTest66", + "0x6A92535c4A4c6125189e8fe686a4270aBf06B5dA": "LoadTest65", + "0x8B7eDC33CEB2E0529559c1B1c9211F78C17a3E3f": "LoadTest64", + "0x1B99A6F05112C4da889277A124FbA2a6D8F35f23": "LoadTest63", + "0xC702Ea524559cD0BCDdf1DA161e01af57D0deE2e": "LoadTest62", + "0x4DE045f5609691Ee561B5Dd89886834d19d25CC2": "LoadTest61", + "0x09B6DE227e6CCC3d35ac2493d610f9F12081406C": "LoadTest60", + "0x42df4128492d6d791f6d9AFaB8915A23793822B8": "LoadTest59", + "0x66d2aF171A51063568c44811390C7AF097F74667": "LoadTest58", + "0xE6431Ae8fB8fAbcD91483dE6C2f1E13dCFe0Ec22": "LoadTest57", + "0xdF3c9C9d95a7902A86B20a4C421beb1a13ba79da": "LoadTest56", + "0x5c931CB4a76bF2F863f85A10523311Da313F7D2f": "LoadTest55", + "0x65ABFc3f7f966d0Ea0a17A2d05DF0C1812B50BDE": "LoadTest54", + "0x8f7F28D8D6a159E28437a814Ae7D539615F29e26": "LoadTest53", + "0x0b20C50EcAe0d006BEc0f4793862CC3DcB8fc8Fb": "LoadTest52", + "0x0743bdD3835E6108e5BAcc9f6F34b8AbFc3E736c": "LoadTest51", + "0x2d4a27Bc98b5bE1d159c212aD269b14257Ed5BF0": "LoadTest50", + "0xD167E4C7099aac8Eb9F76D41CCAa711852558522": "LoadTest49", + "0x62D39224D1369420A81417a823a77c104Aa7C2E2": "LoadTest48", + "0x166Becd4191Fa0593e1f2bB383e87F95184c3395": "LoadTest47", + "0x2890c9aF7548e186Cb8B3627b058EE7E6F84F218": "LoadTest46", + "0xF553515A3280057699992880b3245C8ed52cCc18": "LoadTest45", + "0x2d3DEa9c6d848069b3D5d5855285636b0Be4F8a9": "LoadTest44", + "0x9d31bb0E31e7B86F1ED8e227F7feF55523C52E83": "LoadTest43", + "0xF4A8d062947f04f450D3168414DD4c8A1237bF61": "LoadTest42", + "0xB818908d66E2D13a150BE8DFeE1cD625A9855792": "LoadTest41", + "0xfD491F4cFA2425b4b41F5EEcfc5694f0782bFE27": "LoadTest40", + "0xE011426Bb05156f41f108eDf2f3a60323E151Ab6": "LoadTest39", + "0x605941a96995360c0e84253515dc95Ebe07c210b": "LoadTest38", + "0x8b8b1f22491785d511d39D335eAB1a3C395E317d": "LoadTest37", + "0x8a97c7b93e50fBC5C65a5D7aa5C36272a804DfB9": "LoadTest36", + "0xD0af94f26CA2ec137B22C2193B6d3A82C79F567A": "LoadTest35", + "0xA9641917565cB06B719239F6a47A0Cf35d2e87c0": "LoadTest34", + "0x4BB28417F19abf8317b6986c6B6d68B2E9e6BBCF": "LoadTest33", + "0xf95F3961E9ac263709813bfcD64B9ae59F253513": "LoadTest32", + "0xE3710d290b54743fb2c395A13d2177Fc9a4066a9": "LoadTest31", + "0xC24AD31eCf822B3b1042c91e63A8c2525352a5bD": "LoadTest30", + "0xf937593E18cFC7C69ad6007373Da94354b335A8F": "LoadTest29", + "0x824616e85Ffce2bdfCDA6c071568bBfefFe16B86": "LoadTest28", + "0xc39CC83069849d674919A20c8fe5BBd09cf33CD7": "LoadTest27", + "0xDd90d7C5F66a4c269719bD510D7E44BB7e440576": "LoadTest26", + "0xD48E580bceb6e3883b6c8C6060fC058d44438A06": "LoadTest25", + "0x6ab5e54f7Da4aC6E184b12B7f5A60E8a33Db49A3": "LoadTest24", + "0xc8EB567375f23c0199E7ed29Ae05b5B837D46E64": "LoadTest23", + "0xeF98b60f0E31Ee97C7898Cd9CE2E67c1166F3838": "LoadTest22", + "0x13105a3580560DC209859801e7289E60F44F880a": "LoadTest21", + "0xb2D3015C7356Dfde2FFe3AaBf148460A03dc74A3": "Hochschule Osnabrück", + "0x4aADFC11088Bd53033297fDb7D97329500F34e9f": "FIWARE Foundation e.V.", + "0x345d301C97eb25468fDd7eDfb1B6e9C7f0B9F784": "Universität Siegen", + "0xEa458168651e7D254408Ea941BAf4210de1564E1": "Hans Berg GmbH & Co. KG", + "0x6Ec302A62ed554878b9e7862BF1bd5cdd22d03c7": "Netcompany-Intrasoft", + "0xA6FEd8D39cF98C6f7d4c31Da790c9c94e837c3ca": "Laboratory for Manufacturing Systems & Automation", + "0xD63fFbB727dc1Bf681F727b78b5F4C738E01f6Db": "Beia Consult International", + "0xAACA0075fF1B3E4ea45F9A1B758aD564c494dDA6": "Anasoft Technology AG", + "0x66867df4d2f36F56BC11B439A9f94A74D8bF7724": "AAS Info", + "0x8794d6a657a7fBA841f652C67c73788fd26cE3E9": "PFG001 Info", + "0x340bE58F9e963D02EA44d7505fb5458EfDc8f9ad": "DTI AAS Submodel", + "0x951Bc7F73c18880a012CCdD826901Ae89a085bc7": "PFG001 Technical", + "0x95c4DCC1ffffF15408798741155f0af793732f0B": "PFG001 Logs", + "0x9e39b65823240014787D435C41D5D060De985270": "PFG001 Nameplate", + "0x660Efd8b8BdA4428b9021Cd83620ee765e68b15e": "Berger Holding GmbH & Co. KG", + "0x47cE30B4F213802c17770c97dEa32e1EC3B64Ca7": "Load Test 01", + "0xA05555a187BdCB944694B5793776fD66d6ea63D4": "Load Test 02", + "0xa7092969eF3065678a41deb20ac31A5aB1F57D59": "Load Test 03", + "0x355b0D5855698f9585865462C3fB83128782cb06": "Load Test 04", + "0xCaa643e87398756324459AD932CD8976090A5414": "Load Test 05", + "0xcd40fEAE40407183835c99365ffC5dD7A24B9c63": "Load Test 06", + "0x5A7EAD2342fB60Cb417F4c5dB88DA141054c1471": "Load Test 07", + "0x6589da080ff3998d771Da6CB66F66f2484f73104": "Load Test 08", + "0x87009Da243ABA40AD3Aea0ed5412134AB797A2BF": "Load Test 09", + "0xe4aB3f5e474d2B1744fD0f092C009d95737AF9b7": "Load Test 10", + "0xf8E1067F6180D9f2d6dB2B5700444660E124601F": "Load Test 11", + "0xAd69D5cfCeD384C2DF605D7e035d2877A23358d9": "Load Test 12", + "0xE3624076eF8E50E5295e42C6c1A021DC8d5219AD": "Load Test 13", + "0xeDb71622A8e8B0a5d221D6C3aD8b8362eD79753A": "Load Test 14", + "0x556EB581bd7D5dF11Fe8e6935552B0845d8b14FB": "Load Test 15", + "0xc3215d478bE967c0006466d460626c78d0a93Eed": "Load Test 16", + "0x8BEFE9429298df2653F6Fc9B73D96dB99b819644": "Load Test 17", + "0xe19b2bce4ffEbFbF3C34E8aE7C9E4b860E007E06": "Load Test 18", + "0xD09a7644b0F3a8DC2256865c4E6eFe1e64025476": "Load Test 19", + "0x9E78FaFF24f21b68aaaa9acC781ffeF269A0D559": "Load Test 20", + "0x43d3004D0232243cC4878419b6897f5f50713eAE": "Bruno Kessler Foundation", + "0x32e561E6A8615f3Ec6aD2397e6F75d05cd81d0f5": "neogramm GmbH", + "0xD9BAB8E6279CE41C2bC3f1D44ceF855235e0CdB7": "Gühring KG", + "0x6406F91b03a7ffbf858e57C3fa205Ae549EFB1a5": "Tool Performance", + "0x6417A347Ad30d0745cBB3a851DF7C72517c4705C": "Process Optimization", + "0xb20D3889931517d9AA1D7306c9a521F506f88245": "Tool Recommendation", + "0xb505CB7D3d251867968e72D628036A5c501F5466": "Xayn AG", + "0x0021a0cF84f83a04dFE402549e97C7DD21c5adA4": "SCHUNK SE & Co. KG", + "0xd480cfd1decc61cec35127e26611b47088b5f619": "Transport Dimensions SAR-1300", + "0x6E9F4E8890A8e3401FF632FC61f7cBF839d5BB70": "Design Rules SAR-1300", + "0x2588DCeC3f6a8400D0eAaa57669f8EC8e261fd59": "Scanner Specification SAR-1300", + "0xCf53CfbFabCc7Fa74cc8fB4218Ac7621bEe6bf0f": "Specifications for SAR-1300", + "0xA8C26ab25C8F476aB488078B9bA6D60C4E7bEE2B": "SAR-1300 Technical Drawing", + "0xe5AfCf1BF4FfCa6c1f19463605578e8146CdF4b1": "University of British Columbia", + "0xb993dfC7cAf2477770e60E1Ae6188F6147BDA92d": "ZERTIFIER SL", + "0x6F28a052eeb897d6412A8198D0DDF1FC15fe3D94": "Future Mobility Network B.V.", + "0x1504d3AE9224091990Cb2F71D0e10B8F7E84E7De": "NVWA", + "0x4680420FD71E0C8ABDae60EFdF685206E9bdbF3E": "LMIS AG", + "0x57fa18A57f4B8198a4781D4Cc850631F7be8333F": "DEKRA Digital GmbH", + "0x9B421d0f5d378b66324251d6CDc1945a6560110b": "SIMAVI", + "0x13a9FfFC7fb684CCc623C305B46b7eD6b3a73C66": "ENGINSOFT", + "0x7d46Bb46ba45f08480bA80150d3594fd9f3e212d": "IMT Atlantique", + "0xc9034e58176c59153F53C6B59d5CFD5BBD58b5Fc": "Aarhus University", + "0xB9fB84b093D8bE26A78208b324D8074627374F49": "HWR Berlin", + "0xEEC041b73BC4FcAE2B0a66F9992d2b6d1959BbD1": "Tronico SAS", + "0x7e7cea5dda047F66b8755Cb4Bf1d8eDBFB236e35": "Airbus Atlantic", + "0x13f8514cA72C83386929f0BAa9bCe6B840cbA03A": "Continental Automotive", + "0x98bDc1EaDE6D4ad7032A091Dc8bE6D217cB37eF3": "iED", + "0xFB7Cb9F2E15F3935B22FB9846d69b46bD31edf07": "Health Check 1", + "0xB33185E37610bC6f5b00cC26827317EE6fDF547a": "PTW TU Darmstadt", + "0x8e9307D95f3aF50DCc655Af3EAE89B24501b848D": "Poznan Supercomputing and Networking Center (PSNC)", + "0xe1D7Cf58357Ce5dFCa2343221610138A196C0FEE": "Hochschule für angewandte Wissenschaften Kempten", + "0xdEB9D710BF2B1BB1C86845e52CAA86fBEEB87819": "Fundació i2CAT", + "0x0E05173b57b5a7e69932792617614e8e9601438F": "Fraunhofer IVI", + "0x874B6a89B201d8249c11e908b21554d14f6B3F2a": "NTT DATA Spain", + "0xD231e64574a18eb5FB49cE2e18923681c07a7E51": "IMEC Belgium", + "0x7E13628a092637e480c7c266692381784d909069": "AStar Technologies", + "0x35C38A98dC3c452062d7af71A08aeA11a3353dB6": "AStar Technologies", + "0x7bEe4CD4DD492390eB76B5Af125763BF40484d28": "TSG Technologie und Service GmbH", + "0x12aFee9a899aF6037552bE750958F6bD3Db12A03": "Gebr. Heller Maschinenfabrik GmbH", + "0xF8F830B34C61493E7A688515660d5c38e9700C19": "SIDENOR STEEL INDUSTRY S.A.", + "0xCBeD907179189073c5861a8059Fa98F10dE2ACE9": "Pontus-X DAO" +} diff --git a/scripts/copy-addresses.js b/scripts/copy-addresses.js index 04d7437c..1b8e7d3f 100644 --- a/scripts/copy-addresses.js +++ b/scripts/copy-addresses.js @@ -5,17 +5,13 @@ const addressJsonFile = join( __dirname, '../node_modules/@oceanprotocol/contracts/addresses/address.json' ) -const genxAddressesFile = join(__dirname, '../genxAddress.json') const addressJson = JSON.parse(readFileSync(addressJsonFile).toString()) -const genxAddresses = JSON.parse(readFileSync(genxAddressesFile).toString()) - const newObject = { - ...addressJson, - ...genxAddresses + ...addressJson } writeFileSync(addressJsonFile, JSON.stringify(newObject)) -console.log('Added GEN-X addresses to', addressJsonFile) +console.log('Added addresses to', addressJsonFile) diff --git a/src/@context/Automation/AutomationProvider.tsx b/src/@context/Automation/AutomationProvider.tsx index f75f6702..db4fb3c3 100644 --- a/src/@context/Automation/AutomationProvider.tsx +++ b/src/@context/Automation/AutomationProvider.tsx @@ -21,16 +21,11 @@ export enum AUTOMATION_MODES { ADVANCED = 'advanced' } -export interface NativeTokenBalance { - symbol: string - balance: string -} export interface AutomationProviderValue { autoWallet: Wallet autoWalletAddress: string isAutomationEnabled: boolean balance: UserBalance - nativeBalance: NativeTokenBalance isLoading: boolean decryptPercentage: number hasValidEncryptedWallet: boolean @@ -65,8 +60,12 @@ function AutomationProvider({ children }) { address: autoWallet?.address as `0x${string}` }) - const [nativeBalance, setNativeBalance] = useState() - const [balance, setBalance] = useState({}) + const [balance, setBalance] = useState({ + native: { + symbol: 'eth', + balance: '0' + } + }) const [hasDeleteRequest, setHasDeleteRequest] = useState(false) @@ -98,16 +97,22 @@ function AutomationProvider({ children }) { if (!autoWallet) return try { + const newBalance: UserBalance = { + native: { + symbol: 'eth', + balance: '0' + } + } if (balanceNativeToken) - setNativeBalance({ - symbol: balanceNativeToken?.symbol.toLowerCase() || 'ETH', - balance: balanceNativeToken?.formatted - }) + newBalance.native.symbol = + balanceNativeToken?.symbol.toLowerCase() || 'eth' + newBalance.native.balance = balanceNativeToken?.formatted if (approvedBaseTokens?.length > 0) { - const newBalance = await getApprovedTokenBalances(autoWallet?.address) - setBalance(newBalance) - } else setBalance(undefined) + const approved = await getApprovedTokenBalances(autoWallet?.address) + newBalance.approved = approved + } + setBalance(newBalance) } catch (error) { LoggerInstance.error('[AutomationProvider] Error: ', error.message) } @@ -207,7 +212,6 @@ function AutomationProvider({ children }) { autoWallet, autoWalletAddress, balance, - nativeBalance, isAutomationEnabled, isLoading, decryptPercentage, diff --git a/src/@context/MarketMetadata/_types.ts b/src/@context/MarketMetadata/_types.ts index 8801a154..2cf441c4 100644 --- a/src/@context/MarketMetadata/_types.ts +++ b/src/@context/MarketMetadata/_types.ts @@ -36,6 +36,20 @@ export interface AppConfig { roughTxGasEstimate: number } showPreviewAlert: string + networkAlertConfig: { + // Refresh interval for network status - 30 sec + refreshInterval: number + // Margin of error for block count (how much difference between min / max block numbers before showing an alert) + errorMargin: number + // Map chainIds to their respective status endpoints + statusEndpoints: { + [chainId: number]: string + } + } + faucet: { + enabled: string + baseUri: string + } } export interface SiteContent { siteTitle: string @@ -52,12 +66,14 @@ export interface SiteContent { description?: string image?: string category?: string + isLive?: boolean subItems?: { name: string link: string description?: string image?: string category?: string + isLive?: boolean }[] }[] }[] diff --git a/src/@context/UserPreferences.tsx b/src/@context/UserPreferences.tsx index 0249428a..d5d87ace 100644 --- a/src/@context/UserPreferences.tsx +++ b/src/@context/UserPreferences.tsx @@ -32,10 +32,10 @@ interface UserPreferencesValue { setAutomationWalletJSON: (encryptedWallet: string) => void automationWalletMode: AUTOMATION_MODES setAutomationWalletMode: (mode: AUTOMATION_MODES) => void - onboardingStep: number - setOnboardingStep: (step: number) => void showOnboardingModule: boolean setShowOnboardingModule: (value: boolean) => void + onboardingStep: number + setOnboardingStep: (step: number) => void } const UserPreferencesContext = createContext(null) @@ -95,16 +95,16 @@ function UserPreferencesProvider({ localStorage?.automationWalletMode || AUTOMATION_MODES.SIMPLE ) - const [onboardingStep, setOnboardingStep] = useState( - localStorage?.onboardingStep || 0 - ) - const [showOnboardingModule, setShowOnboardingModule] = useState( localStorage?.showOnboardingModule === undefined - ? true + ? false : localStorage?.showOnboardingModule ) + const [onboardingStep, setOnboardingStep] = useState( + localStorage?.onboardingStep || 0 + ) + // Write values to localStorage on change useEffect(() => { setLocalStorage({ @@ -117,8 +117,8 @@ function UserPreferencesProvider({ allowExternalContent, automationWalletJSON: automationWallet, automationWalletMode, - onboardingStep, - showOnboardingModule + showOnboardingModule, + onboardingStep }) }, [ chainIds, @@ -130,8 +130,8 @@ function UserPreferencesProvider({ allowExternalContent, automationWallet, automationWalletMode, - onboardingStep, - showOnboardingModule + showOnboardingModule, + onboardingStep ]) // Set ocean.js log levels, default: Error @@ -201,10 +201,10 @@ function UserPreferencesProvider({ setAutomationWalletJSON: setAutomationWallet, automationWalletMode, setAutomationWalletMode, - onboardingStep, - setOnboardingStep, showOnboardingModule, - setShowOnboardingModule + setShowOnboardingModule, + onboardingStep, + setOnboardingStep } as UserPreferencesValue } > diff --git a/src/@hooks/useAddressConfig.ts b/src/@hooks/useAddressConfig.ts index 8a781f98..61322d8e 100644 --- a/src/@hooks/useAddressConfig.ts +++ b/src/@hooks/useAddressConfig.ts @@ -2,11 +2,11 @@ import addressConfig from '../../address.config' const { whitelists, featured, - verifiedWallets + verifiedAddresses }: { whitelists: UseAddressConfig['whitelists'] featured: UseAddressConfig['featured'] - verifiedWallets: UseAddressConfig['verifiedWallets'] + verifiedAddresses: UseAddressConfig['verifiedAddresses'] } = addressConfig export interface UseAddressConfig { @@ -15,7 +15,7 @@ export interface UseAddressConfig { 'datatokens.address': string[] } featured: { assets: string[]; title: string }[] - verifiedWallets: { + verifiedAddresses: { [key: string]: string } isAddressWhitelisted: (address: string) => boolean @@ -70,7 +70,7 @@ export function useAddressConfig(): UseAddressConfig { return { whitelists, featured, - verifiedWallets, + verifiedAddresses, isAddressWhitelisted, isDDOWhitelisted, hasFeaturedAssets, diff --git a/src/@hooks/useBalance.tsx b/src/@hooks/useBalance.tsx index 2eacb2f3..9462ae76 100644 --- a/src/@hooks/useBalance.tsx +++ b/src/@hooks/useBalance.tsx @@ -11,7 +11,7 @@ import { getTokenBalance } from '@utils/wallet' interface BalanceProviderValue { balance: UserBalance - getApprovedTokenBalances: (address: string) => Promise + getApprovedTokenBalances: (address: string) => Promise } function useBalance(): BalanceProviderValue { @@ -22,12 +22,15 @@ function useBalance(): BalanceProviderValue { const { chain } = useNetwork() const [balance, setBalance] = useState({ - eth: '0' + native: { + symbol: 'eth', + balance: '0' + } }) const getApprovedTokenBalances = useCallback( - async (address: string): Promise => { - const newBalance: UserBalance = {} + async (address: string): Promise => { + const newBalance: TokenBalances = {} if (approvedBaseTokens?.length > 0) { await Promise.allSettled( @@ -64,11 +67,13 @@ function useBalance(): BalanceProviderValue { try { const userBalance = balanceNativeToken?.formatted const key = balanceNativeToken?.symbol.toLowerCase() - const newNativeBalance: UserBalance = { [key]: userBalance } - const newBalance = { - ...newNativeBalance, - ...(await getApprovedTokenBalances(address)) + const newBalance: UserBalance = { + native: { + symbol: key, + balance: userBalance + }, + approved: await getApprovedTokenBalances(address) } setBalance(newBalance) diff --git a/src/@hooks/useNetworkMetadata/utils.ts b/src/@hooks/useNetworkMetadata/utils.ts index 9fbdc554..a8f43a26 100644 --- a/src/@hooks/useNetworkMetadata/utils.ts +++ b/src/@hooks/useNetworkMetadata/utils.ts @@ -45,9 +45,6 @@ export function getNetworkDisplayName(data: EthereumListsChain): string { case 2021000: displayName = 'GAIA-X' break - case 100: - displayName = 'GEN-X Testnet' - break case 32456: displayName = 'Pontus-X Devnet' break diff --git a/src/@types/AssetExtended.d.ts b/src/@types/AssetExtended.d.ts index 71d63e26..abb730c4 100644 --- a/src/@types/AssetExtended.d.ts +++ b/src/@types/AssetExtended.d.ts @@ -1,4 +1,4 @@ -import { Asset } from '@oceanprotocol/lib' +import { Asset, Metadata } from '@oceanprotocol/lib' // declaring into global scope to be able to use this as // ambiant types despite the above imports @@ -6,7 +6,7 @@ declare global { interface AssetExtended extends Asset { accessDetails?: AccessDetails views?: number - metadata: MetadataExtended + metadata: Metadata services: ServiceExtended[] } } diff --git a/src/@types/TokenBalance.d.ts b/src/@types/TokenBalance.d.ts index d51e735d..bd117f8c 100644 --- a/src/@types/TokenBalance.d.ts +++ b/src/@types/TokenBalance.d.ts @@ -1,3 +1,11 @@ interface UserBalance { + native: { + symbol: string + balance: string + } + approved?: TokenBalances +} + +interface TokenBalances { [key: string]: string } diff --git a/src/@utils/compute.ts b/src/@utils/compute.ts index 0b455d51..c1798fdf 100644 --- a/src/@utils/compute.ts +++ b/src/@utils/compute.ts @@ -295,6 +295,24 @@ async function getJobs( return computeJobs } +/** + * in case multiple providers return the same computeJob, filter these duplicates + * e.g. same instance listens on multiple domains + */ +export function filterForUniqueJobs( + jobs: ComputeJobMetaData[], + assets: Asset[] +): ComputeJobMetaData[] { + return jobs.filter((job) => { + const { inputDID, providerUrl } = job + + // compare providerUrl where the job status was accessed from + // with the serviceEndpoint found in asset with first inputDID + const inputAsset = assets.find((asset) => asset.id === inputDID[0]) + return providerUrl === inputAsset?.services[0]?.serviceEndpoint + }) +} + export async function getComputeJobs( chainIds: number[], accountId: string, @@ -353,7 +371,9 @@ export async function getComputeJobs( providerUrls.push(asset.services[0].serviceEndpoint) ) - computeResult.computeJobs = await getJobs(providerUrls, accountId, assets) + const allProviderJobs = await getJobs(providerUrls, accountId, assets) + computeResult.computeJobs = filterForUniqueJobs(allProviderJobs, assets) + computeResult.isLoaded = true return computeResult diff --git a/src/@utils/dispenser.ts b/src/@utils/dispenser.ts index e4eec505..577f6558 100644 --- a/src/@utils/dispenser.ts +++ b/src/@utils/dispenser.ts @@ -9,17 +9,20 @@ export async function setMinterToPublisher( ): Promise { const datatokenInstance = new Datatoken(signer) - const response = await datatokenInstance.removeMinter( + const removeMinterTx = await datatokenInstance.removeMinter( datatokenAddress, accountId, accountId ) - if (!response) { + if (!removeMinterTx) { setError('Updating DDO failed.') LoggerInstance.error('Failed at cancelMinter') } - return response + + await removeMinterTx.wait() + + return removeMinterTx } export async function setMinterToDispenser( @@ -30,14 +33,16 @@ export async function setMinterToDispenser( ): Promise { const datatokenInstance = new Datatoken(signer) - const response = await datatokenInstance.addMinter( + const addMinterTx = await datatokenInstance.addMinter( datatokenAddress, accountId, accountId ) - if (!response) { + if (!addMinterTx) { setError('Updating DDO failed.') LoggerInstance.error('Failed at makeMinter') } - return response + await addMinterTx.wait() + + return addMinterTx } diff --git a/src/@utils/downloadJSON.ts b/src/@utils/downloadJSON.ts new file mode 100644 index 00000000..f12d98a6 --- /dev/null +++ b/src/@utils/downloadJSON.ts @@ -0,0 +1,21 @@ +export function isValidJSON(json: string): boolean { + try { + JSON.parse(json) + return true + } catch (e) { + return false + } +} + +export function downloadJSON(json: string, filename: string): void { + if (isValidJSON(json)) { + const element = document.createElement('a') + const file = new Blob([json], { + type: 'application/json' + }) + element.href = URL.createObjectURL(file) + element.download = `${filename}.json` + document.body.appendChild(element) + element.click() + } +} diff --git a/src/@utils/faucet/index.ts b/src/@utils/faucet/index.ts index a5c568d9..26f7ccb9 100644 --- a/src/@utils/faucet/index.ts +++ b/src/@utils/faucet/index.ts @@ -54,10 +54,12 @@ export async function requestTokens( message?: string }>(`${faucet.baseUri}/request_tokens/${network}`, { address, signature }) + if (response.data.status === 'error') { + throw response.data.message + } + return response.data.txHashes } catch (error) { - throw new Error( - `Failed to request tokens for address ${address}: ${error.message}` - ) + throw new Error(`Failed to request tokens for address ${address}: ${error}`) } } diff --git a/src/@utils/ocean/index.ts b/src/@utils/ocean/index.ts index f3873e81..a9116db7 100644 --- a/src/@utils/ocean/index.ts +++ b/src/@utils/ocean/index.ts @@ -42,6 +42,7 @@ export function getOceanConfig(network: string | number): Config { network === 'gaiaxtestnet' || network === 'pontusx' || network === 32456 || + network === 32457 || network === 2021000 || network === 8996 ? undefined diff --git a/src/@utils/onboarding.ts b/src/@utils/onboarding.ts index 036d7d7f..3d79fc3e 100644 --- a/src/@utils/onboarding.ts +++ b/src/@utils/onboarding.ts @@ -15,7 +15,7 @@ const getErrorMessage = ({ return 'Looks like your account is not connected to the portal, please go back to the "Connect" step.' } if (!getSupportedChainIds().includes(networkId)) { - return 'Looks like you are not connected to the GEN-X Testnet, please go back to the "Network" step.' + return 'Looks like you are not connected to a supported network, please go back to the "Network" step.' } return 'Looks like something went wrong, please try again.' diff --git a/src/@utils/wallet/index.ts b/src/@utils/wallet/index.ts index b37f4187..de93ee3f 100644 --- a/src/@utils/wallet/index.ts +++ b/src/@utils/wallet/index.ts @@ -51,11 +51,15 @@ export const connectKitTheme = { '--ck-secondary-button-border-radius': 'var(--border-radius)' } -export function accountTruncate(account: string): string { +export function accountTruncate( + account: string, + begin: number = 6, + end: number = 38 +): string { if (!account || account === '') return - const middle = account.substring(6, 38) + const middle = account.substring(begin, end) const truncated = account.replace(middle, '…') - return truncated + return truncated // for example 0xb9A3...941d } export async function addTokenToWallet( @@ -176,12 +180,12 @@ export async function getTokenBalance( } } -export function getTokenBalanceFromSymbol( +export function getApprovedTokenBalanceFromSymbol( balance: UserBalance, symbol: string ): string { if (!symbol) return - - const baseTokenBalance = balance?.[symbol.toLocaleLowerCase()] + const { approved } = balance + const baseTokenBalance = approved?.[symbol.toLocaleLowerCase()] return baseTokenBalance || '0' } diff --git a/src/components/@shared/AssetList/index.tsx b/src/components/@shared/AssetList/index.tsx index 4e4a8d80..b5fa1bfd 100644 --- a/src/components/@shared/AssetList/index.tsx +++ b/src/components/@shared/AssetList/index.tsx @@ -1,5 +1,5 @@ import AssetTeaser from '@shared/AssetTeaser' -import { ReactElement, useState } from 'react' +import { ReactElement, useEffect, useState } from 'react' import Pagination from '@shared/Pagination' import styles from './index.module.css' import AssetTitle from '@shared/AssetListTitle' @@ -10,8 +10,19 @@ import { getServiceByName } from '@utils/ddo' import AssetViewSelector, { AssetViewOptions } from './AssetViewSelector' import Time from '../atoms/Time' import Loader from '../atoms/Loader' +import NetworkName from '../NetworkName' +import { useUserPreferences } from '../../../@context/UserPreferences' -const columns: TableOceanColumn[] = [ +const networkColumn: TableOceanColumn = { + name: 'Network', + selector: (row) => { + const { chainId } = row + return + }, + maxWidth: '10rem' +} + +const tableColumns: TableOceanColumn[] = [ { name: 'Dataset', selector: (row) => { @@ -96,6 +107,17 @@ export default function AssetList({ showAssetViewSelector, defaultAssetView }: AssetListProps): ReactElement { + const { chainIds } = useUserPreferences() + + const [columns, setColumns] = useState(tableColumns) + + useEffect(() => { + if (chainIds.length > 1) { + const [datasetColumn, ...otherColumns] = tableColumns + setColumns([datasetColumn, networkColumn, ...otherColumns]) + } else setColumns(tableColumns) + }, [chainIds]) + const [activeAssetView, setActiveAssetView] = useState( defaultAssetView || AssetViewOptions.Grid ) diff --git a/src/components/@shared/AssetTeaser/index.tsx b/src/components/@shared/AssetTeaser/index.tsx index 38b08006..e8203ad0 100644 --- a/src/components/@shared/AssetTeaser/index.tsx +++ b/src/components/@shared/AssetTeaser/index.tsx @@ -54,7 +54,9 @@ export default function AssetTeaser({ {name.slice(0, 200)} - {!noPublisher && } + {!noPublisher && ( + + )} {!noDescription && (
diff --git a/src/components/@shared/DDODownloadButton/_validation.ts b/src/components/@shared/DDODownloadButton/_validation.ts new file mode 100644 index 00000000..504fcc37 --- /dev/null +++ b/src/components/@shared/DDODownloadButton/_validation.ts @@ -0,0 +1,24 @@ +import * as Yup from 'yup' + +export const initialValuesAsset = { + didweb: '', + credentialHostingPath: '', + pathToParticipantCredential: '', + knownDependencyCredentials: '', + knownAggregatedServiceCredentials: '' +} + +export const validationAsset = Yup.object().shape({ + didweb: Yup.string() + .matches(/^did:web:/, 'Invalid DID (only did:web is allowed)') + .required('Required'), + credentialHostingPath: Yup.string() + .url('Invalid URL') + .matches(/.*[^/]$/, 'URL must not end with /') + .required('Required'), + pathToParticipantCredential: Yup.string() + .url('Invalid URL') + .required('Required'), + knownDependencyCredentials: Yup.string().optional().url('Invalid URL'), + knownAggregatedServiceCredentials: Yup.string().optional().url('Invalid URL') +}) diff --git a/src/components/@shared/DDODownloadButton/createJSON.ts b/src/components/@shared/DDODownloadButton/createJSON.ts new file mode 100644 index 00000000..a02f67dc --- /dev/null +++ b/src/components/@shared/DDODownloadButton/createJSON.ts @@ -0,0 +1,73 @@ +import { downloadJSON } from '@utils/downloadJSON' + +export interface DDOData { + id: string + services: { timeout: string }[] +} + +interface FormData { + didweb: string + credentialHostingPath: string + pathToParticipantCredential: string + dependencyCredentialsList: { id: string }[] + serviceCredentialList: { id: string }[] +} + +function getDomain(url: string) { + url = url.split('/').splice(0, 3).join('/') + return url +} + +export function createServiceCredential(asset: DDOData, formData: FormData) { + const filename = `service_did_op_${asset.id.split(':')[2]}` // to get only the id without did:op: + const metadata = { + '@context': [ + 'https://www.w3.org/2018/credentials/v1', + 'https://w3id.org/security/suites/jws-2020/v1', + 'https://registry.lab.gaia-x.eu/development/api/trusted-shape-registry/v1/shapes/jsonld/trustframework#' + ], + type: 'VerifiableCredential', + id: `${formData.credentialHostingPath}/${filename}.json`, + issuer: formData.didweb, + issuanceDate: '', + credentialSubject: { + id: asset.id, + type: 'gx:ServiceOffering', + 'gx:providedBy': { + id: formData.pathToParticipantCredential + }, + 'gx:maintainedBy': { + id: formData.pathToParticipantCredential + }, + 'gx:serviceOffering:serviceModel': 'subscription', + 'gx:serviceOffering:subscriptionDuration': + asset.services[0].timeout || 'unlimited', + 'gx:policy': `${formData.credentialHostingPath}/yourpolicy.json`, + 'gx:termsAndConditions': { + 'gx:URL': '[basedomain]/yourtermsandconditions.txt', + 'gx:hash': '[hash]' + }, + 'gx:dataAccountExport': { + 'gx:requestType': 'email', + 'gx:accessType': 'digital', + 'gx:formatType': 'mime/json' + }, + 'gx:serviceOffering:dataProtectionRegime': ['GDPR2016'], + 'gx:serviceOffering:gdpr': [ + { + 'gx:serviceOffering:imprint': `${getDomain( + formData.credentialHostingPath + )}/imprint/` + }, + { + 'gx:serviceOffering:privacyPolicy': `${getDomain( + formData.credentialHostingPath + )}/privacy/` + } + ], + 'gx:dependsOn': formData.dependencyCredentialsList || [], + 'gx:aggregationOf': formData.serviceCredentialList || [] + } + } + downloadJSON(JSON.stringify(metadata), filename) +} diff --git a/src/components/@shared/DDODownloadButton/index.module.css b/src/components/@shared/DDODownloadButton/index.module.css new file mode 100644 index 00000000..cc8ca93c --- /dev/null +++ b/src/components/@shared/DDODownloadButton/index.module.css @@ -0,0 +1,18 @@ +.credential_margin_bottom { + margin-bottom: calc(var(--spacer) * var(--line-height)); +} +.credential_input { + width: 70%; +} + +.credential_input_div { + display: flex; + justify-content: space-between; + align-items: flex-end; + flex-wrap: wrap; + width: 100%; +} + +.button { + max-height: 70px; +} diff --git a/src/components/@shared/DDODownloadButton/index.tsx b/src/components/@shared/DDODownloadButton/index.tsx new file mode 100644 index 00000000..aa5a47fc --- /dev/null +++ b/src/components/@shared/DDODownloadButton/index.tsx @@ -0,0 +1,120 @@ +import { ReactElement, useState } from 'react' +import Button from '../atoms/Button' +import Modal from '../atoms/Modal' +import Input from '../FormInput' +import { createServiceCredential, DDOData } from './createJSON' +import { Field, Form, Formik } from 'formik' +import { getFieldContent } from '@utils/form' +import content from '../../../../content/DDOtoServiceCredential/serviceCredentialForm.json' +import { initialValuesAsset, validationAsset } from './_validation' +import InputWithList from './inputWithList' +import styles from './index.module.css' + +interface values { + didweb: string + credentialHostingPath: string + pathToParticipantCredential: string + knownDependencyCredentials: string + knownAggregatedServiceCredentials: string +} + +export default function DDODownloadButton({ + asset +}: { + asset: DDOData +}): ReactElement { + const [openModal, setOpenModal] = useState(false) + const [serviceCredentialList, setServiceCredentialList] = useState< + { id: string }[] + >([]) + const [dependencyCredentialsList, setDependencyCredentialsList] = useState< + { id: string }[] + >([]) + const clearLists = () => { + setOpenModal(false) + setServiceCredentialList([]) + setDependencyCredentialsList([]) + } + const handleSubmit = (values: values) => { + const formData = { + ...values, + serviceCredentialList, + dependencyCredentialsList + } + createServiceCredential(asset, formData) + clearLists() + } + + return ( + <> + + + { + clearLists() + }} + > +

+ This manual export functionality will assist you to create Gaia-X + Service Credentials for this service which can be added to this + service for verification against the  + + . Credentials should be signed and hosted by the service provider. +

+ +
+ + + + + + + +
+
+ + ) +} diff --git a/src/components/@shared/DDODownloadButton/inputWithList.tsx b/src/components/@shared/DDODownloadButton/inputWithList.tsx new file mode 100644 index 00000000..006a1146 --- /dev/null +++ b/src/components/@shared/DDODownloadButton/inputWithList.tsx @@ -0,0 +1,82 @@ +import { getFieldContent } from '@utils/form' +import content from '../../../../content/DDOtoServiceCredential/serviceCredentialForm.json' +import { Field, useFormikContext } from 'formik' +import Input from '../FormInput' +import Button from '../atoms/Button' +import { useState } from 'react' +import styles from './index.module.css' +import { ListItem } from '../atoms/Lists' + +export default function InputWithList({ + fieldname, + setList, + list +}: { + fieldname: string + setList: (list: { id: string }[]) => void + list: { id: string }[] +}) { + const [serviceCredential, setServiceCredential] = useState() + const { setFieldValue, errors } = useFormikContext() + // add credential to the credentiallist + const addCredential = () => { + if (serviceCredential.trim() && !errors[fieldname]) { + setList([...list, { id: serviceCredential }]) + setServiceCredential('') + } + } + // delete credential from the list + const deleteCredential = (index: number) => { + const filteredList = list.filter((_, i) => i !== index) + setList([...filteredList]) + } + return ( + <> +
+
+ ) => { + setServiceCredential((e.target as HTMLInputElement).value) + setFieldValue(fieldname, (e.target as HTMLInputElement).value) + }} + component={Input} + name={fieldname} + /> +
+ + +
+ {list.length > 0 && ( + <> +
+ {fieldname === 'knownDependencyCredentials' + ? 'Known dependency credentials' + : 'Known aggregated service credentials'} +
+
    + {list.map((item, index) => ( + + {item.id} + + + ))} +
+ + )} + + ) +} diff --git a/src/components/@shared/FormInput/InputElement/ConsumerParameters/_validation.ts b/src/components/@shared/FormInput/InputElement/ConsumerParameters/_validation.ts index 518ecb25..e8d0fc1c 100644 --- a/src/components/@shared/FormInput/InputElement/ConsumerParameters/_validation.ts +++ b/src/components/@shared/FormInput/InputElement/ConsumerParameters/_validation.ts @@ -34,7 +34,7 @@ export const validationConsumerParameters: { ) return occasions.length === 1 }) - .min(4, (param) => `Name must be at least ${param.min} characters`) + .min(1, (param) => `Name must be at least ${param.min} characters`) .max(50, (param) => `Name must have maximum ${param.max} characters`) .required('Required'), type: Yup.string().oneOf(paramTypes).required('Required'), diff --git a/src/components/@shared/FormInput/InputElement/FilesInput/index.tsx b/src/components/@shared/FormInput/InputElement/FilesInput/index.tsx index 1e82c592..903f891a 100644 --- a/src/components/@shared/FormInput/InputElement/FilesInput/index.tsx +++ b/src/components/@shared/FormInput/InputElement/FilesInput/index.tsx @@ -184,7 +184,7 @@ export default function FilesInput(props: InputProps): ReactElement { {storageType !== 'saas' && ( - +
+

{cardTitle}

+

{cardDescription}

+
+

{cardExplainerTitle}

+
    +
  1. {cardExplainerFirstStep}
  2. +
  3. {cardExplainerSecondStep}
  4. +
  5. {cardExplainerThirdStep}
  6. +
  7. {cardExplainerFourthStep}
  8. +
  9. {cardExplainerFithStep}
  10. +
+
+
+ {cardNetworkAddress}: {accountAddress} +
+
+ {cardNetwork}: +
+ + {!isLoading && error && (
@@ -166,3 +171,5 @@ export default function FaucetPage({
) } + +export default FaucetPage diff --git a/src/components/Footer/Links.tsx b/src/components/Footer/Links.tsx index 139e5e42..0b251515 100644 --- a/src/components/Footer/Links.tsx +++ b/src/components/Footer/Links.tsx @@ -45,7 +45,7 @@ export default function Links(): ReactElement { href="https://portal.pontus-x.eu/privacy/en" className={styles.link} > - Privacy + Privacy Policy {appConfig.privacyPreferenceCenter === 'true' && ( + {live ? ( + + ) : ( + + )}
diff --git a/src/components/Home/Ecosystem/index.tsx b/src/components/Home/Ecosystem/index.tsx index 664cf3e4..de3ca496 100644 --- a/src/components/Home/Ecosystem/index.tsx +++ b/src/components/Home/Ecosystem/index.tsx @@ -18,6 +18,7 @@ export default function Ecosystem() { image={portal.image} link={portal.link} title={portal.name} + live={portal.isLive} /> ))} diff --git a/src/components/Home/TopSales/Account/index.tsx b/src/components/Home/TopSales/Account/index.tsx index 72a67794..a3a0e294 100644 --- a/src/components/Home/TopSales/Account/index.tsx +++ b/src/components/Home/TopSales/Account/index.tsx @@ -16,7 +16,7 @@ export default function Account({ account, place }: AccountProps): ReactElement { - const { verifiedWallets } = useAddressConfig() + const { verifiedAddresses } = useAddressConfig() return ( @@ -24,7 +24,7 @@ export default function Account({
- {verifiedWallets?.[account.id] || accountTruncate(account.id)} + {verifiedAddresses?.[account.id] || accountTruncate(account.id)}

{account.totalSales} diff --git a/src/components/Profile/Header/Account.tsx b/src/components/Profile/Header/Account.tsx index fab02f42..aa1770eb 100644 --- a/src/components/Profile/Header/Account.tsx +++ b/src/components/Profile/Header/Account.tsx @@ -18,7 +18,7 @@ export default function Account({ }): ReactElement { const { chainIds } = useUserPreferences() const { autoWalletAddress } = useAutomation() - const { verifiedWallets } = useAddressConfig() + const { verifiedAddresses } = useAddressConfig() return (

@@ -31,7 +31,7 @@ export default function Account({

- {verifiedWallets?.[accountId] || accountTruncate(accountId)}{' '} + {verifiedAddresses?.[accountId] || accountTruncate(accountId)}{' '} {autoWalletAddress === accountId && ( diff --git a/src/components/Publish/Navigation/index.module.css b/src/components/Publish/Navigation/index.module.css index c1f2c6a2..a395610a 100644 --- a/src/components/Publish/Navigation/index.module.css +++ b/src/components/Publish/Navigation/index.module.css @@ -1,11 +1,13 @@ .navigation { margin: -1.3rem calc(var(--spacer) / -1.5) var(--spacer) calc(var(--spacer) / -1.5); - padding: calc(var(--spacer) / 2) 0; scrollbar-width: none; border-bottom: 1px solid var(--border-color); background-color: var(--brand-black); color: var(--brand-white); + border-radius: var(--border-radius-sm) var(--border-radius-sm) 0 0; + overflow-x: auto; + -webkit-overflow-scrolling: touch; } @media (min-width: 40rem) { @@ -16,26 +18,29 @@ } } -@media (min-width: 60rem) { - .navigation { - padding: var(--spacer) 0; - margin-left: calc(var(--spacer) * -4); - margin-right: calc(var(--spacer) * -4); - } -} - .navigation ol { white-space: nowrap; text-align: center; width: 100%; - padding: 0; + padding: calc(var(--spacer) / 2) 0; margin: 0; counter-reset: list-number; - overflow-x: auto; + overflow-x: visible; overflow-y: hidden; -webkit-overflow-scrolling: touch; } +@media (min-width: 60rem) { + .navigation { + margin-left: calc(var(--spacer) * -4); + margin-right: calc(var(--spacer) * -4); + } + + .navigation ol { + padding: var(--spacer) 0; + } +} + .navigation li { cursor: pointer; display: inline-block; diff --git a/src/components/Publish/Pricing/Fees.tsx b/src/components/Publish/Pricing/Fees.tsx index acbc4a42..9b3b4d1d 100644 --- a/src/components/Publish/Pricing/Fees.tsx +++ b/src/components/Publish/Pricing/Fees.tsx @@ -46,7 +46,7 @@ export default function Fees({ const { appConfig } = useMarketMetadata() useEffect(() => { - getOpcFees(chain?.id || 100).then((response: OpcFeesData) => { + getOpcFees(chain?.id || 32457).then((response: OpcFeesData) => { setOceanCommunitySwapFee( response?.swapOceanFee ? new Decimal(response.swapOceanFee).mul(100).toString() diff --git a/src/components/Publish/index.tsx b/src/components/Publish/index.tsx index c89c2963..5d475cdc 100644 --- a/src/components/Publish/index.tsx +++ b/src/components/Publish/index.tsx @@ -26,6 +26,7 @@ import { setNFTMetadataAndTokenURI } from '@utils/nft' import { customProviderUrl } from '../../../app.config' import { useAccount, useNetwork, useSigner } from 'wagmi' import { useAutomation } from '../../@context/Automation/AutomationProvider' +import Container from '@components/@shared/atoms/Container' export default function PublishPage({ content diff --git a/src/pages/faucet.tsx b/src/pages/faucet.tsx index c6809954..ce02133a 100644 --- a/src/pages/faucet.tsx +++ b/src/pages/faucet.tsx @@ -1,23 +1,24 @@ import { ReactElement } from 'react' -import { useRouter } from 'next/router' -import Verify from '../components/Faucet' -import AssetProvider from '@context/Asset' +import Faucet from '../components/Faucet' import content from '../../content/pages/faucet.json' import Page from '@components/@shared/Page' +import { useMarketMetadata } from '../@context/MarketMetadata' +import { useRouter } from 'next/router' + +export default function PageFaucet(): ReactElement { + const { + appConfig: { faucet } + } = useMarketMetadata() -export default function PageVerify(): ReactElement { const router = useRouter() - const { did } = router.query - return ( - - - + if (faucet.enabled === 'true') { + return ( + + - - ) + ) + } else { + router.push('/404') + } } diff --git a/src/stylesGlobal/styles.css b/src/stylesGlobal/styles.css index 55ae7d5a..1cc6516b 100644 --- a/src/stylesGlobal/styles.css +++ b/src/stylesGlobal/styles.css @@ -10,6 +10,7 @@ html, body { margin: 0; padding: 0; + overflow-x: hidden; } html {