diff --git a/contracts/tasks/index.ts b/contracts/tasks/index.ts index 19050a901..98c143c27 100644 --- a/contracts/tasks/index.ts +++ b/contracts/tasks/index.ts @@ -15,6 +15,7 @@ import './runners/finalize' import './runners/claim' import './runners/cancel' import './runners/exportRound' +import './runners/exportImages' import './runners/mergeAllocation' import './runners/loadSimpleUsers' import './runners/loadMerkleUsers' diff --git a/contracts/tasks/runners/exportImages.ts b/contracts/tasks/runners/exportImages.ts new file mode 100644 index 000000000..7800a85a2 --- /dev/null +++ b/contracts/tasks/runners/exportImages.ts @@ -0,0 +1,83 @@ +/** + * Export the project logo images in a ClrFund round. + * + * Sample usage: + * yarn hardhat export-images \ + * --output-dir ../vue-apps/public/ipfs + * --gateway https://ipfs.io + * --round-file ../vue-app/src/rounds/arbitrum/0x4A2d90844EB9C815eF10dB0371726F0ceb2848B0.json + * + * Notes: + * 1) This script assumes the round has been exported using the `export-round` hardhat task + */ + +import { task } from 'hardhat/config' +import { isPathExist, makeDirectory } from '../../utils/misc' +import { getIpfsContent } from '@clrfund/common' +import fs from 'fs' +import { dirname } from 'path' + +/** + * Download the IPFS file with the ipfsHash to the output directory + * @param gateway IPFS gateway url + * @param ipfsHash IPFS hash of the file to download + * @param outputDir The directory to store the downloaded file + */ +async function download({ + gateway, + ipfsHash, + outputDir, +}: { + gateway: string + ipfsHash: string + outputDir: string +}) { + if (!ipfsHash) return + + const res = await getIpfsContent(ipfsHash, gateway) + if (res.hasBody()) { + console.log('Downloaded', ipfsHash) + const path = `${outputDir}/${ipfsHash}` + const folder = dirname(path) + if (!isPathExist(folder)) { + makeDirectory(folder) + } + + fs.writeFileSync(path, res.body) + } +} + +task('export-images', 'Export project logo images') + .addParam('outputDir', 'The output directory') + .addParam('roundFile', 'The exported funding round file path') + .addParam('gateway', 'The IPFS gateway url') + .setAction(async ({ outputDir, roundFile, gateway }) => { + console.log('Starting to download from ipfs') + + const data = fs.readFileSync(roundFile, { encoding: 'utf-8' }) + const round = JSON.parse(data) + const projects = round.projects + const images = projects.map((project: any) => { + const { bannerImageHash, thumbnailImageHash, imageHash } = + project.metadata + return { bannerImageHash, thumbnailImageHash, imageHash } + }) + + for (let i = 0; i < images.length; i++) { + await download({ + gateway, + ipfsHash: images[i].bannerImageHash, + outputDir, + }) + await download({ + gateway, + ipfsHash: images[i].thumbnailImageHash, + outputDir, + }) + await download({ + gateway, + ipfsHash: images[i].imageHash, + outputDir, + }) + } + }) diff --git a/subgraph/config/clrfund-arbitrum.json b/subgraph/config/clrfund-arbitrum.json new file mode 100644 index 000000000..2c58c9603 --- /dev/null +++ b/subgraph/config/clrfund-arbitrum.json @@ -0,0 +1,6 @@ +{ + "network": "arbitrum-one", + "address": "0xc06349D95C30551Ea510bD5F35CfA2151499D60a", + "factoryStartBlock": 96912420, + "recipientRegistryStartBlock": 96912420 +} diff --git a/vue-app/public/ipfs/QmPxnsQH5JmR3SBBNqKrwVpwC42o5sZa65e27CKEKgsJD5 b/vue-app/public/ipfs/QmPxnsQH5JmR3SBBNqKrwVpwC42o5sZa65e27CKEKgsJD5 new file mode 100644 index 000000000..05b75eeda Binary files /dev/null and b/vue-app/public/ipfs/QmPxnsQH5JmR3SBBNqKrwVpwC42o5sZa65e27CKEKgsJD5 differ diff --git a/vue-app/public/ipfs/QmQ8GpH77woYKNWv52Tm8D3XiYj6HFC9G9YLCqBg7p4Rkm b/vue-app/public/ipfs/QmQ8GpH77woYKNWv52Tm8D3XiYj6HFC9G9YLCqBg7p4Rkm new file mode 100644 index 000000000..ad58f6047 Binary files /dev/null and b/vue-app/public/ipfs/QmQ8GpH77woYKNWv52Tm8D3XiYj6HFC9G9YLCqBg7p4Rkm differ diff --git a/vue-app/public/ipfs/QmQHumCg23oSudjfZ3KJCbwQvL4WUfPM9gn9ZxvZk8WC5n b/vue-app/public/ipfs/QmQHumCg23oSudjfZ3KJCbwQvL4WUfPM9gn9ZxvZk8WC5n new file mode 100644 index 000000000..6bddbae41 Binary files /dev/null and b/vue-app/public/ipfs/QmQHumCg23oSudjfZ3KJCbwQvL4WUfPM9gn9ZxvZk8WC5n differ diff --git a/vue-app/public/ipfs/QmQJ1XsTdtprMfoS6YmfxXrTGs2UcKCPJY9Xxxim8jMzRJ b/vue-app/public/ipfs/QmQJ1XsTdtprMfoS6YmfxXrTGs2UcKCPJY9Xxxim8jMzRJ new file mode 100644 index 000000000..4222c4345 Binary files /dev/null and b/vue-app/public/ipfs/QmQJ1XsTdtprMfoS6YmfxXrTGs2UcKCPJY9Xxxim8jMzRJ differ diff --git a/vue-app/public/ipfs/QmRYqxGhrJSvfUtyR3UzZaPeNSxZu949G4ccdsfh1NWNw9 b/vue-app/public/ipfs/QmRYqxGhrJSvfUtyR3UzZaPeNSxZu949G4ccdsfh1NWNw9 new file mode 100644 index 000000000..45d8cfccd Binary files /dev/null and b/vue-app/public/ipfs/QmRYqxGhrJSvfUtyR3UzZaPeNSxZu949G4ccdsfh1NWNw9 differ diff --git a/vue-app/public/ipfs/QmS9prKBsWauuny5M2Zb89F3iFu6GAxvnNqXFiehwGxGut b/vue-app/public/ipfs/QmS9prKBsWauuny5M2Zb89F3iFu6GAxvnNqXFiehwGxGut new file mode 100644 index 000000000..e89c0e6f5 Binary files /dev/null and b/vue-app/public/ipfs/QmS9prKBsWauuny5M2Zb89F3iFu6GAxvnNqXFiehwGxGut differ diff --git a/vue-app/public/ipfs/QmSCSm8FCkAKvbQvRUHvgcFgcTfDymqBnF8LpPUcPdz3V9 b/vue-app/public/ipfs/QmSCSm8FCkAKvbQvRUHvgcFgcTfDymqBnF8LpPUcPdz3V9 new file mode 100644 index 000000000..37d1968b7 Binary files /dev/null and b/vue-app/public/ipfs/QmSCSm8FCkAKvbQvRUHvgcFgcTfDymqBnF8LpPUcPdz3V9 differ diff --git a/vue-app/public/ipfs/QmSXcLBFZiruQs1m3Kg6Ad5D7QqXUX1rF1zYBsyKCg4e5L b/vue-app/public/ipfs/QmSXcLBFZiruQs1m3Kg6Ad5D7QqXUX1rF1zYBsyKCg4e5L new file mode 100644 index 000000000..9508008e5 Binary files /dev/null and b/vue-app/public/ipfs/QmSXcLBFZiruQs1m3Kg6Ad5D7QqXUX1rF1zYBsyKCg4e5L differ diff --git a/vue-app/public/ipfs/QmT5EcHQcMP4oXpuzKuAdzFBoB3gpHbk2wXKxU6PcmsBtt b/vue-app/public/ipfs/QmT5EcHQcMP4oXpuzKuAdzFBoB3gpHbk2wXKxU6PcmsBtt new file mode 100644 index 000000000..79eb933b3 Binary files /dev/null and b/vue-app/public/ipfs/QmT5EcHQcMP4oXpuzKuAdzFBoB3gpHbk2wXKxU6PcmsBtt differ diff --git a/vue-app/public/ipfs/QmTQXxMMoEgoRmdmHJD6FfZL7VcGXtfRSMLGAynCEhDBiX b/vue-app/public/ipfs/QmTQXxMMoEgoRmdmHJD6FfZL7VcGXtfRSMLGAynCEhDBiX new file mode 100644 index 000000000..077da2c08 Binary files /dev/null and b/vue-app/public/ipfs/QmTQXxMMoEgoRmdmHJD6FfZL7VcGXtfRSMLGAynCEhDBiX differ diff --git a/vue-app/public/ipfs/QmTjpSQgF7RPVTrJczNn8YtfFCMv92dEV62YuA3SvhUT6t b/vue-app/public/ipfs/QmTjpSQgF7RPVTrJczNn8YtfFCMv92dEV62YuA3SvhUT6t new file mode 100644 index 000000000..43c80a311 Binary files /dev/null and b/vue-app/public/ipfs/QmTjpSQgF7RPVTrJczNn8YtfFCMv92dEV62YuA3SvhUT6t differ diff --git a/vue-app/public/ipfs/QmTpkkj6jzZsxqT5qBJ1Bo4fxTbpyHy6LDDZgoFT8WeTCh b/vue-app/public/ipfs/QmTpkkj6jzZsxqT5qBJ1Bo4fxTbpyHy6LDDZgoFT8WeTCh new file mode 100644 index 000000000..3756f3987 Binary files /dev/null and b/vue-app/public/ipfs/QmTpkkj6jzZsxqT5qBJ1Bo4fxTbpyHy6LDDZgoFT8WeTCh differ diff --git a/vue-app/public/ipfs/QmUJwNYqpDHaYWna3i9MxXvYDFF3GqfdNtb9GMG4Rw5kzB b/vue-app/public/ipfs/QmUJwNYqpDHaYWna3i9MxXvYDFF3GqfdNtb9GMG4Rw5kzB new file mode 100644 index 000000000..cd975729b Binary files /dev/null and b/vue-app/public/ipfs/QmUJwNYqpDHaYWna3i9MxXvYDFF3GqfdNtb9GMG4Rw5kzB differ diff --git a/vue-app/public/ipfs/QmURDsTvaDWdJmEyiPxVzEysrdggU3V4amZVDUx17SwNHy b/vue-app/public/ipfs/QmURDsTvaDWdJmEyiPxVzEysrdggU3V4amZVDUx17SwNHy new file mode 100644 index 000000000..0d615a549 Binary files /dev/null and b/vue-app/public/ipfs/QmURDsTvaDWdJmEyiPxVzEysrdggU3V4amZVDUx17SwNHy differ diff --git a/vue-app/public/ipfs/QmURVakedfajWX1MTjKQhwR78Y6oB4DWFpshYKReFBg3Tb b/vue-app/public/ipfs/QmURVakedfajWX1MTjKQhwR78Y6oB4DWFpshYKReFBg3Tb new file mode 100644 index 000000000..4abd761a4 Binary files /dev/null and b/vue-app/public/ipfs/QmURVakedfajWX1MTjKQhwR78Y6oB4DWFpshYKReFBg3Tb differ diff --git a/vue-app/public/ipfs/QmUrfiFi9efugmh91FBegc332PMEfmJ2HSunvx93AsB9no b/vue-app/public/ipfs/QmUrfiFi9efugmh91FBegc332PMEfmJ2HSunvx93AsB9no new file mode 100644 index 000000000..8f4860f4e Binary files /dev/null and b/vue-app/public/ipfs/QmUrfiFi9efugmh91FBegc332PMEfmJ2HSunvx93AsB9no differ diff --git a/vue-app/public/ipfs/QmWf6HJkvqcRLtB1to8CU5wSMmeqAYwF5bcHcNWEZtkuLU b/vue-app/public/ipfs/QmWf6HJkvqcRLtB1to8CU5wSMmeqAYwF5bcHcNWEZtkuLU new file mode 100644 index 000000000..10c9d3d98 Binary files /dev/null and b/vue-app/public/ipfs/QmWf6HJkvqcRLtB1to8CU5wSMmeqAYwF5bcHcNWEZtkuLU differ diff --git a/vue-app/public/ipfs/QmXHrzPGkJv7VfJnUquDAenj4kLd9ZQJMdZuFgYdErQADS b/vue-app/public/ipfs/QmXHrzPGkJv7VfJnUquDAenj4kLd9ZQJMdZuFgYdErQADS new file mode 100644 index 000000000..510c768c9 Binary files /dev/null and b/vue-app/public/ipfs/QmXHrzPGkJv7VfJnUquDAenj4kLd9ZQJMdZuFgYdErQADS differ diff --git a/vue-app/public/ipfs/QmXoVF2wwRrfQXD7QcnkAYkgy2T9KueXGgRK9mAtGs3ZKY b/vue-app/public/ipfs/QmXoVF2wwRrfQXD7QcnkAYkgy2T9KueXGgRK9mAtGs3ZKY new file mode 100644 index 000000000..70650cc82 Binary files /dev/null and b/vue-app/public/ipfs/QmXoVF2wwRrfQXD7QcnkAYkgy2T9KueXGgRK9mAtGs3ZKY differ diff --git a/vue-app/public/ipfs/QmY3QYEXNSMdj3BpbeCooKeYuK3FJDh6bg8PXybeh6r9BC b/vue-app/public/ipfs/QmY3QYEXNSMdj3BpbeCooKeYuK3FJDh6bg8PXybeh6r9BC new file mode 100644 index 000000000..ce3fd27e1 Binary files /dev/null and b/vue-app/public/ipfs/QmY3QYEXNSMdj3BpbeCooKeYuK3FJDh6bg8PXybeh6r9BC differ diff --git a/vue-app/public/ipfs/QmYRbaB2S42vmgkCzXC6FcJ2B2nnvAzKRWj247bjTPeJY4 b/vue-app/public/ipfs/QmYRbaB2S42vmgkCzXC6FcJ2B2nnvAzKRWj247bjTPeJY4 new file mode 100644 index 000000000..ef3ef442d Binary files /dev/null and b/vue-app/public/ipfs/QmYRbaB2S42vmgkCzXC6FcJ2B2nnvAzKRWj247bjTPeJY4 differ diff --git a/vue-app/public/ipfs/QmYxLTYvcHegHQaoxNKdaAJ5vLjxiMVNkK7zW1c1pTS8Q9 b/vue-app/public/ipfs/QmYxLTYvcHegHQaoxNKdaAJ5vLjxiMVNkK7zW1c1pTS8Q9 new file mode 100644 index 000000000..a90ce1b71 Binary files /dev/null and b/vue-app/public/ipfs/QmYxLTYvcHegHQaoxNKdaAJ5vLjxiMVNkK7zW1c1pTS8Q9 differ diff --git a/vue-app/public/ipfs/QmZBHjJ7zP7nxnhYcg1zP6okvBrn6UTn2tNiTM5zqRUNNm b/vue-app/public/ipfs/QmZBHjJ7zP7nxnhYcg1zP6okvBrn6UTn2tNiTM5zqRUNNm new file mode 100644 index 000000000..8c92d9756 Binary files /dev/null and b/vue-app/public/ipfs/QmZBHjJ7zP7nxnhYcg1zP6okvBrn6UTn2tNiTM5zqRUNNm differ diff --git a/vue-app/public/ipfs/QmZEQAyB5sidegqdzuBxDvyPmAamGMJEVH3pXZazoY61rV b/vue-app/public/ipfs/QmZEQAyB5sidegqdzuBxDvyPmAamGMJEVH3pXZazoY61rV new file mode 100644 index 000000000..63179c70e Binary files /dev/null and b/vue-app/public/ipfs/QmZEQAyB5sidegqdzuBxDvyPmAamGMJEVH3pXZazoY61rV differ diff --git a/vue-app/public/ipfs/QmaFrX4g4UhVyrku1Xdih399EDx4VZ3DTziEQVeedHL9NS b/vue-app/public/ipfs/QmaFrX4g4UhVyrku1Xdih399EDx4VZ3DTziEQVeedHL9NS new file mode 100644 index 000000000..a237fd857 Binary files /dev/null and b/vue-app/public/ipfs/QmaFrX4g4UhVyrku1Xdih399EDx4VZ3DTziEQVeedHL9NS differ diff --git a/vue-app/public/ipfs/Qmak7yM6bacqCcjofZUSG2pUMSbPTTLeLXTFrPFkfhcyE2 b/vue-app/public/ipfs/Qmak7yM6bacqCcjofZUSG2pUMSbPTTLeLXTFrPFkfhcyE2 new file mode 100644 index 000000000..bb2231fbd Binary files /dev/null and b/vue-app/public/ipfs/Qmak7yM6bacqCcjofZUSG2pUMSbPTTLeLXTFrPFkfhcyE2 differ diff --git a/vue-app/public/ipfs/QmaymdaJWCeyxaTJo3Yrpkg1MyxMLZLQ2TH6BN94iWtfmR b/vue-app/public/ipfs/QmaymdaJWCeyxaTJo3Yrpkg1MyxMLZLQ2TH6BN94iWtfmR new file mode 100644 index 000000000..0c5d06a45 Binary files /dev/null and b/vue-app/public/ipfs/QmaymdaJWCeyxaTJo3Yrpkg1MyxMLZLQ2TH6BN94iWtfmR differ diff --git a/vue-app/public/ipfs/QmbRvwX1bHKvNMzdfBrfD9iJjdpKJkA1Vop5PnY2C8DH3H b/vue-app/public/ipfs/QmbRvwX1bHKvNMzdfBrfD9iJjdpKJkA1Vop5PnY2C8DH3H new file mode 100644 index 000000000..e9f76a08d Binary files /dev/null and b/vue-app/public/ipfs/QmbRvwX1bHKvNMzdfBrfD9iJjdpKJkA1Vop5PnY2C8DH3H differ diff --git a/vue-app/public/ipfs/QmbTqL3TB9oH5UM8Yet5atJX4iSAn7LeYh4DsodxVJGrxG b/vue-app/public/ipfs/QmbTqL3TB9oH5UM8Yet5atJX4iSAn7LeYh4DsodxVJGrxG new file mode 100644 index 000000000..0f12bdd51 Binary files /dev/null and b/vue-app/public/ipfs/QmbTqL3TB9oH5UM8Yet5atJX4iSAn7LeYh4DsodxVJGrxG differ diff --git a/vue-app/public/ipfs/QmbZjyxTj96jyRMgDgReiTzk3RNcTR4pMEhNvHZwoARZvi b/vue-app/public/ipfs/QmbZjyxTj96jyRMgDgReiTzk3RNcTR4pMEhNvHZwoARZvi new file mode 100644 index 000000000..8ed5a96d4 Binary files /dev/null and b/vue-app/public/ipfs/QmbZjyxTj96jyRMgDgReiTzk3RNcTR4pMEhNvHZwoARZvi differ diff --git a/vue-app/public/ipfs/Qmbc4tcU9pc5xY9FVJbiLpF5sqBSLyYYsZrhgDAAMpprSp b/vue-app/public/ipfs/Qmbc4tcU9pc5xY9FVJbiLpF5sqBSLyYYsZrhgDAAMpprSp new file mode 100644 index 000000000..792554bbd Binary files /dev/null and b/vue-app/public/ipfs/Qmbc4tcU9pc5xY9FVJbiLpF5sqBSLyYYsZrhgDAAMpprSp differ diff --git a/vue-app/public/ipfs/Qmbx3QJ6tSorHowAwyRQEoKDEFKQH6Ub3RMb4mR86Vqm2h b/vue-app/public/ipfs/Qmbx3QJ6tSorHowAwyRQEoKDEFKQH6Ub3RMb4mR86Vqm2h new file mode 100644 index 000000000..4b7bb3bf3 Binary files /dev/null and b/vue-app/public/ipfs/Qmbx3QJ6tSorHowAwyRQEoKDEFKQH6Ub3RMb4mR86Vqm2h differ diff --git a/vue-app/public/ipfs/QmbxMt7BxrR627Re7gW9syCSQcBQUQWzWtDG3oNkwTGN6a b/vue-app/public/ipfs/QmbxMt7BxrR627Re7gW9syCSQcBQUQWzWtDG3oNkwTGN6a new file mode 100644 index 000000000..d0cae0719 Binary files /dev/null and b/vue-app/public/ipfs/QmbxMt7BxrR627Re7gW9syCSQcBQUQWzWtDG3oNkwTGN6a differ diff --git a/vue-app/public/ipfs/Qmc9TgWC3nBS16MbKzPcuEfT2rNXjWASByJLJrynNtDPK4 b/vue-app/public/ipfs/Qmc9TgWC3nBS16MbKzPcuEfT2rNXjWASByJLJrynNtDPK4 new file mode 100644 index 000000000..5001caddd Binary files /dev/null and b/vue-app/public/ipfs/Qmc9TgWC3nBS16MbKzPcuEfT2rNXjWASByJLJrynNtDPK4 differ diff --git a/vue-app/public/ipfs/QmcKkC1hd3diLDB8qUd4TomQv8ysYe8KxJqGABgmqrJoDk b/vue-app/public/ipfs/QmcKkC1hd3diLDB8qUd4TomQv8ysYe8KxJqGABgmqrJoDk new file mode 100644 index 000000000..9f05f74c1 Binary files /dev/null and b/vue-app/public/ipfs/QmcKkC1hd3diLDB8qUd4TomQv8ysYe8KxJqGABgmqrJoDk differ diff --git a/vue-app/public/ipfs/QmceewjVJNTU196CZ1B5T3o6HK1AZede3T1UXZubNqBprJ b/vue-app/public/ipfs/QmceewjVJNTU196CZ1B5T3o6HK1AZede3T1UXZubNqBprJ new file mode 100644 index 000000000..9e8063512 Binary files /dev/null and b/vue-app/public/ipfs/QmceewjVJNTU196CZ1B5T3o6HK1AZede3T1UXZubNqBprJ differ diff --git a/vue-app/public/ipfs/Qmd8FWBRbXBznX3wn4EoTidckevZCFDARoA6sab8mFYdTe b/vue-app/public/ipfs/Qmd8FWBRbXBznX3wn4EoTidckevZCFDARoA6sab8mFYdTe new file mode 100644 index 000000000..94ba71fc8 Binary files /dev/null and b/vue-app/public/ipfs/Qmd8FWBRbXBznX3wn4EoTidckevZCFDARoA6sab8mFYdTe differ diff --git a/vue-app/public/ipfs/Qmd8o8RjZfYLJfRMNuS9hbstJpvTuNkpvUbNTXey4LpLYj b/vue-app/public/ipfs/Qmd8o8RjZfYLJfRMNuS9hbstJpvTuNkpvUbNTXey4LpLYj new file mode 100644 index 000000000..f12ff29c4 Binary files /dev/null and b/vue-app/public/ipfs/Qmd8o8RjZfYLJfRMNuS9hbstJpvTuNkpvUbNTXey4LpLYj differ diff --git a/vue-app/public/ipfs/Qmdf3TkuZw5Bq6CK6rKBhwonzMpcTdAgY7i2zFzuehZtuW b/vue-app/public/ipfs/Qmdf3TkuZw5Bq6CK6rKBhwonzMpcTdAgY7i2zFzuehZtuW new file mode 100644 index 000000000..e763c9aee Binary files /dev/null and b/vue-app/public/ipfs/Qmdf3TkuZw5Bq6CK6rKBhwonzMpcTdAgY7i2zFzuehZtuW differ diff --git a/vue-app/public/ipfs/QmdqboUNBo1425njpK3QJoudrVQ8hCg2oCnE4dgYWGMJV5 b/vue-app/public/ipfs/QmdqboUNBo1425njpK3QJoudrVQ8hCg2oCnE4dgYWGMJV5 new file mode 100644 index 000000000..ca7d0d958 Binary files /dev/null and b/vue-app/public/ipfs/QmdqboUNBo1425njpK3QJoudrVQ8hCg2oCnE4dgYWGMJV5 differ diff --git a/vue-app/public/ipfs/QmeS285PYFgSZ4TCaUN4NLeWtAZ65ipaTA7ohPhw2pKaCE b/vue-app/public/ipfs/QmeS285PYFgSZ4TCaUN4NLeWtAZ65ipaTA7ohPhw2pKaCE new file mode 100644 index 000000000..090c73b9b Binary files /dev/null and b/vue-app/public/ipfs/QmeS285PYFgSZ4TCaUN4NLeWtAZ65ipaTA7ohPhw2pKaCE differ diff --git a/vue-app/public/ipfs/Qmf3xhpPMTkzEb2fF878ja2LhGjB8xciA6rBncNieQ3jNG b/vue-app/public/ipfs/Qmf3xhpPMTkzEb2fF878ja2LhGjB8xciA6rBncNieQ3jNG new file mode 100644 index 000000000..ae4a8445a Binary files /dev/null and b/vue-app/public/ipfs/Qmf3xhpPMTkzEb2fF878ja2LhGjB8xciA6rBncNieQ3jNG differ diff --git a/vue-app/public/ipfs/Qmf672NhtTgNY9wJVR9or9YUDtcn21YR7spUk59SnokJ9X b/vue-app/public/ipfs/Qmf672NhtTgNY9wJVR9or9YUDtcn21YR7spUk59SnokJ9X new file mode 100644 index 000000000..584407978 Binary files /dev/null and b/vue-app/public/ipfs/Qmf672NhtTgNY9wJVR9or9YUDtcn21YR7spUk59SnokJ9X differ diff --git a/vue-app/public/ipfs/QmfAwAAr7YEzRNGwUGBiWyC4RpHXLLdsjC8pXwVS7pPtFr b/vue-app/public/ipfs/QmfAwAAr7YEzRNGwUGBiWyC4RpHXLLdsjC8pXwVS7pPtFr new file mode 100644 index 000000000..5ef7b2947 Binary files /dev/null and b/vue-app/public/ipfs/QmfAwAAr7YEzRNGwUGBiWyC4RpHXLLdsjC8pXwVS7pPtFr differ diff --git a/vue-app/public/ipfs/QmfUzLAcfkuRL4ftPDMGxy8L2Cqpp8EKE9NZpjUNKikiZS b/vue-app/public/ipfs/QmfUzLAcfkuRL4ftPDMGxy8L2Cqpp8EKE9NZpjUNKikiZS new file mode 100644 index 000000000..2c4036409 Binary files /dev/null and b/vue-app/public/ipfs/QmfUzLAcfkuRL4ftPDMGxy8L2Cqpp8EKE9NZpjUNKikiZS differ diff --git a/vue-app/src/App.vue b/vue-app/src/App.vue index 3c7ad9b98..01f555ac1 100644 --- a/vue-app/src/App.vue +++ b/vue-app/src/App.vue @@ -8,8 +8,20 @@ - - +
+ + +
+
+ +
@@ -20,22 +32,29 @@ diff --git a/vue-app/src/graphql/sdk.ts b/vue-app/src/graphql/sdk.ts index fc22db618..dcd511bdb 100644 --- a/vue-app/src/graphql/sdk.ts +++ b/vue-app/src/graphql/sdk.ts @@ -1,7 +1,15 @@ import { GraphQLClient } from 'graphql-request' import { SUBGRAPH_ENDPOINT } from '@/api/core' -import { getSdk } from './API' +import { getSdk, type SdkFunctionWrapper } from './API' const client = new GraphQLClient(SUBGRAPH_ENDPOINT) -export default getSdk(client) + +const wrapper: SdkFunctionWrapper = (action, _operationName, _operationType) => { + if (!SUBGRAPH_ENDPOINT) { + throw new Error('Subgraph not available') + } + return action() +} + +export default getSdk(client, wrapper) diff --git a/vue-app/src/router/index.ts b/vue-app/src/router/index.ts index 86a75d5b9..e6e415a07 100644 --- a/vue-app/src/router/index.ts +++ b/vue-app/src/router/index.ts @@ -1,6 +1,6 @@ import { createRouter, createWebHashHistory } from 'vue-router' import type { RouteRecordRaw } from 'vue-router' -import { isUserRegistrationRequired, isOptimisticRecipientRegistry, isActiveApp } from '@/api/core' +import { isUserRegistrationRequired, isOptimisticRecipientRegistry } from '@/api/core' const Landing = () => import('@/views/Landing.vue') const JoinLanding = () => import('@/views/JoinLanding.vue') @@ -262,7 +262,7 @@ if (isUserRegistrationRequired) { ) } -if (isOptimisticRecipientRegistry && isActiveApp) { +if (isOptimisticRecipientRegistry) { routes.push({ path: '/recipients', name: 'recipients', diff --git a/vue-app/src/stores/app.ts b/vue-app/src/stores/app.ts index 65b7fc494..ad873972d 100644 --- a/vue-app/src/stores/app.ts +++ b/vue-app/src/stores/app.ts @@ -9,8 +9,8 @@ import { serializeCart, } from '@/api/contributions' import { getCommittedCart } from '@/api/cart' -import { operator, chain, ThemeMode, recipientRegistryType, recipientJoinDeadlineConfig, isActiveApp } from '@/api/core' -import { type RoundInfo, RoundStatus, getRoundInfo, getLeaderboardRoundInfo } from '@/api/round' +import { operator, chain, ThemeMode, recipientRegistryType, recipientJoinDeadlineConfig } from '@/api/core' +import { type RoundInfo, RoundStatus, getRoundInfo, getStaticRoundInfo } from '@/api/round' import { getTally, type Tally } from '@/api/tally' import { type ClrFund, getClrFundInfo, getMatchingFunds } from '@/api/clrFund' import { getMACIFactoryInfo, type MACIFactory } from '@/api/maci-factory' @@ -70,11 +70,6 @@ export const useAppStore = defineStore('app', { return recipientJoinDeadlineConfig } - if (!isActiveApp) { - // when running in static mode, do not allow adding recipients - return DateTime.now() - } - const recipientStore = useRecipientStore() if (!state.currentRound || !recipientStore.recipientRegistryInfo) { return null @@ -470,38 +465,6 @@ export const useAppStore = defineStore('app', { stateIndex, } }, - async loadStaticClrFundInfo() { - const rounds = await getRounds() - // rounds are sorted in reverse order, first one is the newest round - const currentRound = rounds[0] - - let maxRecipients = 0 - if (currentRound) { - const network = currentRound.network || '' - const currentRoundInfo = await getLeaderboardRoundInfo(currentRound.address, network) - if (currentRoundInfo) { - const matchingPool = await getMatchingFunds(currentRoundInfo.nativeTokenAddress) - this.clrFund = { - nativeTokenAddress: currentRoundInfo.nativeTokenAddress, - nativeTokenSymbol: currentRoundInfo.nativeTokenSymbol, - nativeTokenDecimals: currentRoundInfo.nativeTokenDecimals, - userRegistryAddress: currentRoundInfo.userRegistryAddress, - recipientRegistryAddress: currentRoundInfo.recipientRegistryAddress, - matchingPool, - } - this.selectRound(currentRound.address) - this.currentRound = currentRoundInfo - if (currentRoundInfo.tally) { - this.tally = currentRoundInfo.tally - } - maxRecipients = currentRoundInfo.maxRecipients - } - } - if (!this.clrFund) { - this.clrFund = await getClrFundInfo() - } - await this.loadMACIFactoryInfo(maxRecipients) - }, async loadClrFundInfo() { const clrFund = await getClrFundInfo() this.clrFund = clrFund diff --git a/vue-app/src/utils/chains.ts b/vue-app/src/utils/chains.ts index acab4ecfe..94e752f8a 100644 --- a/vue-app/src/utils/chains.ts +++ b/vue-app/src/utils/chains.ts @@ -15,6 +15,7 @@ export enum ChainId { export type ChainInfo = { [chainId in ChainId]: { label: string + name: string currency: string logo: string isLayer2: boolean @@ -29,6 +30,7 @@ export type ChainInfo = { export const CHAIN_INFO: ChainInfo = { [ChainId.MAINNET]: { label: 'Mainnet', + name: 'mainnet', currency: 'ETH', logo: 'eth.svg', isLayer2: false, @@ -38,6 +40,7 @@ export const CHAIN_INFO: ChainInfo = { }, [ChainId.SEPOLIA]: { label: 'Sepolia', + name: 'sepolia', currency: 'ETH', logo: 'eth.svg', isLayer2: false, @@ -47,6 +50,7 @@ export const CHAIN_INFO: ChainInfo = { }, [ChainId.HARDHAT]: { label: 'Arbitrum Hardhat', + name: 'hardhat', currency: 'AETH', logo: 'arbitrum.svg', isLayer2: true, @@ -58,6 +62,7 @@ export const CHAIN_INFO: ChainInfo = { }, [ChainId.ARBITRUM_ONE]: { label: 'Arbitrum', + name: 'arbitrum', currency: 'AETH', logo: 'arbitrum.svg', isLayer2: true, @@ -69,6 +74,7 @@ export const CHAIN_INFO: ChainInfo = { }, [ChainId.ARBITRUM_RINKEBY]: { label: 'Arbitrum Rinkeby', + name: 'arbitrum-rinkeby', currency: 'AETH', logo: 'arbitrum.svg', isLayer2: true, @@ -80,6 +86,7 @@ export const CHAIN_INFO: ChainInfo = { }, [ChainId.ARBITRUM_GOERLI]: { label: 'Arbitrum Goerli', + name: 'arbitrum-goerli', currency: 'AETH', logo: 'arbitrum.svg', isLayer2: true, @@ -91,6 +98,7 @@ export const CHAIN_INFO: ChainInfo = { }, [ChainId.ARBITRUM_SEPOLIA]: { label: 'Arbitrum Sepolia', + name: 'arbitrum-sepolia', currency: 'AETH', logo: 'arbitrum.svg', isLayer2: true, @@ -102,6 +110,7 @@ export const CHAIN_INFO: ChainInfo = { }, [ChainId.OPTIMISM]: { label: 'Optimism', + name: 'optimism', currency: 'OETH', logo: 'optimism.svg', isLayer2: true, @@ -113,6 +122,7 @@ export const CHAIN_INFO: ChainInfo = { }, [ChainId.OPTIMISM_SEPOLIA]: { label: 'Optimism Sepolia', + name: 'optimism-sepolia', currency: 'OETH', logo: 'optimism.svg', isLayer2: true, @@ -124,6 +134,7 @@ export const CHAIN_INFO: ChainInfo = { }, [ChainId.XDAI]: { label: 'xDai', + name: 'xdai', currency: 'xDai', logo: 'xdai.svg', isLayer2: false, @@ -135,6 +146,7 @@ export const CHAIN_INFO: ChainInfo = { }, [ChainId.POLYGON]: { label: 'Polygon', + name: 'polygon', currency: 'MATIC', logo: 'polygon.svg', isLayer2: false, diff --git a/vue-app/src/utils/url.ts b/vue-app/src/utils/url.ts index 8596ed105..0f797e971 100644 --- a/vue-app/src/utils/url.ts +++ b/vue-app/src/utils/url.ts @@ -1,3 +1,16 @@ +import { ipfsGatewayUrl } from '@/api/core' + export function getAssetsUrl(path) { return new URL(`/src/assets/${path}`, import.meta.url).href } + +export function getStaticUrlByIpfsHash(hash): string | null { + return hash ? `/ipfs/${hash}` : null +} + +export function getIpfsUrl(hash): string | null { + if (!hash || !ipfsGatewayUrl) { + return null + } + return `${ipfsGatewayUrl}/ipfs/${hash}` +} diff --git a/vue-app/src/views/Leaderboard.vue b/vue-app/src/views/Leaderboard.vue index b5c08a706..c7d338ffb 100644 --- a/vue-app/src/views/Leaderboard.vue +++ b/vue-app/src/views/Leaderboard.vue @@ -46,10 +46,9 @@ import { useAppStore } from '@/stores' import { useRouter, useRoute } from 'vue-router' import type { RoundInfo } from '@/api/round' -import { toRoundInfo } from '@/api/round' +import { toRoundInfo, findStaticRound } from '@/api/round' import type { LeaderboardProject } from '@/api/projects' import { toLeaderboardProject } from '@/api/projects' -import { getLeaderboardData } from '@/api/leaderboard' import { getRouteParamValue } from '@/utils/route' const router = useRouter() @@ -63,7 +62,7 @@ const appStore = useAppStore() const { showSimpleLeaderboard } = storeToRefs(appStore) async function loadLeaderboard(address: string, network: string) { - const data = await getLeaderboardData(address, network) + const data = await findStaticRound(address, network) return data } @@ -77,9 +76,9 @@ onMounted(async () => { const network = getRouteParamValue(route.params.network) const data = await loadLeaderboard(address, network) - // redirect to projects view if not finalized or no static round data for leaderboard - if (!data?.projects) { - router.push({ name: 'round' }) + // redirect to projects view if no tally data or no static round data for leaderboard + if (!data?.projects || !data?.tally) { + router.push({ name: 'round', params: { address } }) return } @@ -88,7 +87,7 @@ onMounted(async () => { .filter(project => project.state != 'Removed') .map(project => toLeaderboardProject(project)) .sort((p1: LeaderboardProject, p2: LeaderboardProject) => { - const diff = p2.allocatedAmount - p1.allocatedAmount + const diff = BigInt(p2.allocatedAmount || 0) - BigInt(p1.allocatedAmount || 0) if (diff === BigInt(0)) return 0 if (diff > BigInt(0)) return 1 return -1 @@ -98,7 +97,7 @@ onMounted(async () => { } try { - round.value = toRoundInfo(data.round, network) + round.value = toRoundInfo(data.round) } catch (e) { console.log('Error converting to round info', e) } diff --git a/vue-app/src/views/LeaderboardProject.vue b/vue-app/src/views/LeaderboardProject.vue index 3c4c52ad5..c3dfa65ce 100644 --- a/vue-app/src/views/LeaderboardProject.vue +++ b/vue-app/src/views/LeaderboardProject.vue @@ -2,7 +2,7 @@
- +