diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml new file mode 100644 index 0000000..b7bae4d --- /dev/null +++ b/.github/workflows/deploy.yml @@ -0,0 +1,123 @@ +name: Deploy to IPFS + +on: + push: + branches: [main] + tags: ['v*'] + workflow_dispatch: + +concurrency: + group: deploy-${{ github.ref }} + cancel-in-progress: true + +jobs: + build: + runs-on: ubuntu-latest + container: oven/bun:1-alpine + steps: + - name: Install required tools + run: apk add --no-cache git + + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Install dependencies + run: bun install --frozen-lockfile + + - name: Build SPA + run: bun run build-only + + - name: Upload dist artifact + uses: actions/upload-artifact@v4 + with: + name: dist + path: dist/ + retention-days: 1 + + deploy-rsync: + needs: build + runs-on: ubuntu-latest + container: oven/bun:1-alpine + steps: + - uses: actions/download-artifact@v4 + with: + name: dist + path: dist/ + + - name: Deploy via RSYNC + uses: up9cloud/action-rsync@v1 + env: + USER: ${{ secrets.SSH_USER }} + HOST: ${{ secrets.SSH_HOST }} + KEY: ${{ secrets.SSH_KEY }} + SOURCE: dist/ + TARGET: ${{ github.ref_name }} + + deploy-ipfs: + needs: build + runs-on: ubuntu-latest + container: oven/bun:1-alpine + outputs: + cid: ${{ steps.ipfs.outputs.cid }} + steps: + - uses: actions/download-artifact@v4 + with: + name: dist + path: dist/ + + - name: Deploy to IPFS + uses: ipshipyard/ipfs-deploy-action@v1 + id: ipfs + with: + path-to-deploy: dist + set-github-status: false + set-pr-comment: false + kubo-api-url: ${{ secrets.KUBO_API_URL }} + kubo-api-auth: ${{ secrets.KUBO_API_AUTH }} + upload-car-artifact: false + + deploy-pinata: + needs: [deploy-ipfs, deploy-rsync] + runs-on: ubuntu-latest + container: oven/bun:1-alpine + steps: + - name: Install required tools + run: apk add --no-cache bash curl jq git + + - uses: actions/checkout@v4 + with: + sparse-checkout: package.json + + - uses: actions/download-artifact@v4 + with: + name: dist + path: dist/ + + - name: Install Pinata CLI + run: curl -fsSL https://cli.pinata.cloud/install | bash + + - name: Authenticate Pinata CLI + env: + PINATA_JWT: ${{ secrets.PINATA_JWT }} + run: echo -n "$PINATA_JWT" > ~/.pinata-files-cli + + - name: Upload to Pinata + env: + PINATA_GROUP: ${{ secrets.PINATA_GROUP }} + IPFS_CID: ${{ needs.deploy-ipfs.outputs.cid }} + run: | + export PATH="$HOME/.local/share/pinata/:$PATH" + VERSION=$(jq -r .version package.json) + UPLOAD_JSON=$(pinata upload --group "$PINATA_GROUP" --name "p2pix_${VERSION}" ./dist) + CID=$(echo "$UPLOAD_JSON" | jq -r .cid) + if [ -z "$CID" ] || [ "$CID" = "null" ]; then + echo "Error: Could not parse CID. Output: $UPLOAD_JSON" + exit 1 + fi + { + echo "## Deploy Summary" + echo "- IPFS CID (kubo): \`$IPFS_CID\`" + echo "- Pinata CID: \`$CID\`" + echo "- Version: \`$VERSION\`" + } >> "$GITHUB_STEP_SUMMARY" diff --git a/.github/workflows/ipfs-release.yml b/.github/workflows/ipfs-release.yml deleted file mode 100644 index f01c7a0..0000000 --- a/.github/workflows/ipfs-release.yml +++ /dev/null @@ -1,70 +0,0 @@ -name: Deploy to IPFS - -on: - push: - workflow_dispatch: - -jobs: - build-and-deploy: - runs-on: ubuntu-latest - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Setup Bun - uses: oven-sh/setup-bun@v2 - with: - bun-version: latest - - - name: Install dependencies - run: bun install --frozen-lockfile - - - name: Build SPA - run: bun run build-only - - - name: Deploy via RSYNC - uses: up9cloud/action-rsync@master - env: - USER: ${{secrets.SSH_USER}} - HOST: ${{secrets.SSH_HOST}} - KEY: ${{secrets.SSH_KEY}} - SOURCE: dist/ - TARGET: ${{ gitea.ref_name }} - - - name: Deploy to IPFS - uses: ipshipyard/ipfs-deploy-action@v1 - id: deploy - with: - path-to-deploy: dist - set-github-status: false - set-pr-comment: false - kubo-api-url: ${{ secrets.KUBO_API_URL }} - kubo-api-auth: ${{ secrets.KUBO_API_AUTH }} - upload-car-artifact: false - - - name: Install Pinata CLI - if: secrets.PINATA_JWT != '' - shell: bash - run: curl -fsSL https://cli.pinata.cloud/install | bash - - - name: Authenticate Pinata CLI (write JWT to file) - if: secrets.PINATA_JWT != '' - env: - PINATA_JWT: ${{ secrets.PINATA_JWT }} - run: | - echo -n "$PINATA_JWT" > ~/.pinata-files-cli - - - name: Upload build output to Pinata - if: secrets.PINATA_JWT != '' - id: pinata_upload - run: | - export PATH="$HOME/.local/share/pinata/:$PATH" - VERSION=$(jq -r .version package.json) - UPLOAD_JSON=$(pinata upload --group "${{ secrets.PINATA_GROUP }}" --name "p2pix_${VERSION}" ./dist) - CID=$(echo "$UPLOAD_JSON" | jq -r .cid) - if [ -z "$CID" ] || [ "$CID" = "null" ]; then - echo "Error: Could not parse CID from Pinata upload output. Aborting." - echo "Upload output: $UPLOAD_JSON" - exit 1 - fi - echo "CID=$CID" >> $GITHUB_OUTPUT \ No newline at end of file diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml new file mode 100644 index 0000000..0df0331 --- /dev/null +++ b/.github/workflows/lint.yml @@ -0,0 +1,30 @@ +name: Lint & Format + +on: + push: + branches: [main, develop] + pull_request: + branches: [main, develop] + +concurrency: + group: lint-${{ github.ref }} + cancel-in-progress: true + +jobs: + lint: + runs-on: ubuntu-latest + container: oven/bun:1-alpine + steps: + - name: Install required tools + run: apk add --no-cache git + + - uses: actions/checkout@v4 + + - name: Install dependencies + run: bun install --frozen-lockfile + + - name: ESLint + run: bun run lint + + - name: Prettier check + run: bun run format:check diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml new file mode 100644 index 0000000..e6f8c22 --- /dev/null +++ b/.github/workflows/tests.yml @@ -0,0 +1,28 @@ +name: Tests + +on: + push: + branches: [main, develop] + pull_request: + branches: [main, develop] + +concurrency: + group: tests-${{ github.ref }} + cancel-in-progress: true + +jobs: + unit: + runs-on: ubuntu-latest + container: oven/bun:1-alpine + steps: + - name: Install required tools + run: apk add --no-cache git + + - uses: actions/checkout@v4 + + - name: Install dependencies + run: bun install --frozen-lockfile + + - name: Unit tests (vitest) + run: bunx vitest run --passWithNoTests + diff --git a/.gitignore b/.gitignore index 9ec70ab..b9197fa 100644 --- a/.gitignore +++ b/.gitignore @@ -14,6 +14,8 @@ dist-ssr coverage *.local vendor/ +.dagrobin +.claude /cypress/videos/ /cypress/screenshots/ diff --git a/.prettierrc.json b/.prettierrc.json index 9e26dfe..544138b 100644 --- a/.prettierrc.json +++ b/.prettierrc.json @@ -1 +1,3 @@ -{} \ No newline at end of file +{ + "singleQuote": true +} diff --git a/src/utils/files/faqContent.json b/src/utils/files/faqContent.json index 5be0f1a..0cf8a75 100644 --- a/src/utils/files/faqContent.json +++ b/src/utils/files/faqContent.json @@ -1,53 +1,53 @@ -[ - { - "name": "1. Como Começar", - "items": [ - { - "title": "O que é uma carteira (wallet)?", - "content": "Cripto-wallet é um software que armazena criptomoedas e criptoativos de forma segura. Existem também dispositivos físicos chamados de cold/hard wallets. Com a carteira-cripto você consegue comprar e vender tokens sem a necessidade de uma corretora (exchange), por exemplo. Cripto-ativos não ficam de fato armazenados nessa carteira, mas sim as informações que possibilitam acessá-los numa blockchain, como suas chaves pública e privada.\n
\n\n* **O que é um endereço de carteira (wallet address)?**\n Sequência alfanumérica que permite que você envie e receba suas criptomoedas em segurança. Por exemplo: 3J98t1WpEZ73CNmQviecrnyiWrnqRhWNLy.\n\n* **Como conectar sua carteira ao p2pix?**\n Clique em 'Conectar Carteira'. Escolha qual wallet ou ponte (bridge) utilizará para se conectar (MetaMask ou WalletConnect). Ao clicar, sua carteira se abrirá. Caso seja seu 1º acesso, certifique-se de que permitiu sua carteira a se conectar com nossa plataforma. \n\n* **Como instalar MetaMask no Google Chrome?** \n MetaMask é uma web3 wallet que pode ser adicionada como extensão no seu browser (navegador). Para instalar esse plugin (add-on) no Google Chrome, basta você acessar a Chrome Web Store e pesquisar “MetaMask”. Certifique-se de que é a versão legítima da carteira pelo número de downloads (bastante alto, pois é a maior cold wallet da web3), então é só clicar em “Adicionar ao Chrome”. Depois da instalação ser concluída, basta seguir o passo-a-passo proposto na interface da MetaMask para a criação da conta, login e senha. O caminho para a instalação em outros browsers como Firefox, Opera, entre outros navegadores, é o mesmo. \n\n
\nNota: Não esqueça de guardar sua seed phrase em um local seguro! Sem ela é impossível recuperar o acesso à sua carteira (caso perca sua senha) e também aos seus cripto ativos, eles serão perdidos - literalmente - para sempre.\n" - }, - { - "title": "O que é uma rede (network)?", - "content": "Criptomoedas são transacionadas em redes de computadores, nas blockchains é que ficam armazenadas as informações sobre suas transações, não em um servidor. Existem [diversas redes no ecossistema cripto](https://www.gemini.com/cryptopedia/blockchain-technology-explained), como a rede do Bitcoin, da Ethereum, para citar as duas mais conhecidas. \n
\n\n* **Como selecionar a rede?**\nVocê deve ficar atento a rede que está selecionada em sua carteira. Na MetaMask, escolha a você escolhe a rede que vai operar clicando na primeira caixa ao lado do seu avatar:\n![Image Ethereum](/src/assets/faqEthereum.jpeg)\nCaso você copie um endereço na sua MetaMask estando selecionada a Rede Ethereum Mainnet e queira operar na Polygon, seus cripto ativos serão perdidos. \n\n* **O que é taxa de rede (gas fee)?**\nCusto de transação do blockchain. Você paga essa taxa para a rede que vai remunerar os validadores. É uma forma de incentivar os validadores a dar continuidade nos seus serviços. " - } - ] - }, - { - "name": "2. Comprar tokens", - "items": [ - { - "title": "Como comprar?", - "content": "1. Conectar wallet (MetaMask ou WalletConnect)\n2. Digitar amount (quantidade);\n3. Solicitar token (criptomoeda);\n4. Identificar vendedor (da lista de pessoas);\n * Escanear QRCode (ou acrescenta chave manualmente);\n * Colar e2eID (identificação end-to-end) a.k.a. código de identificação (API Pix / comprovante bancário);\n5. Receber na carteira (wallet conectada." - }, - { - "title": "O que é uma stablecoin?", - "content": "É uma criptomoeda com lastro em moeda fiduciária (por exemplo, Real brasileiro ou Dólar americando). Cada stablecoin gerada por um projeto emissor tem a mesma quantidade em reserva da moeda fiduciária em seu caixa. Alguns exemplos de stablecoins pareadas com dólar americano são USDt, DAI, USDc. Já vinculadas ao preço do Real são BRZ, MBRL e cREAL.\n
\n\n* **O que é o BRZ?**\n [BRZ](https://www.brztoken.io/) é a sigla para Brazilian Digital Token. É um tipo de criptomoeda que tem valor pareado com o Real (BRL). Ou seja, 1 BRZ tem valor igual a 1 BRL." - }, - { - "title": "De quem estou comprando?", - "content": "Vendedores fazem as ofertas e indicam a chave-Pix que irão receber o valor transacionado. Essa oferta fica travada no smart contract até que as transações sejam concluídas e você possa fazer o saque dos seus tokens. \n\n
\n\n* **Onde encontrar comprovante do Pix?**\n Quando você faz um Pix um comprovante é gerado automaticamente para o pagador e para o recebedor. Esse comprovante pode ser acessado no momento da transação via app/site do banco ou pelo seu extrato bancário convencional.\n* **Para onde vão os tokens que eu comprei?**\n Os tokens comprados terão como destino a carteira que você conectou ao p2pix. \n Nota: Lembre-se sempre de configurar a sua carteira na rede correta em que quer receber seus tokens. " - } - ] - }, - { - "name": "3. Vender tokens", - "items": [ - { - "title": "Como vender?", - "content": "1. Enviar tokens;\n2. Indique sua chave-Pix;\n3. Criar [whitelist](https://academy.binance.com/en/glossary/whitelist) onde quer receber isso;\n4. Withdraw (saque) para remoção dos tokens;\n5. Lock (trava de 24h) para esperar transações antes dos saques.\n" - }, - { - "title": "O que é aprovar tokens?", - "content": "Aprovações de tokens funcionam como permissões de sua carteira a um determinado [dApp](https://ethereum.org/en/developers/docs/dapps/) para movimentar os tokens. Ao aprovar tokens, você permite que nosso contrato inteligente acesse e execute as transações na sua carteira web3." - }, - { - "title": "O que é o lock na rede?", - "content": "\"Travamento\" na rede é uma forma de especificar um tempo para retirada dos ativos digitais. O contrato inteligente do p2pix 'trava' os tokens enviados para a rede por 24 horas. Só depois de transcorridas essas 24h que o saque dos tokens estará liberado. Isso ocorre para garantir uma transação segura para os vendedores." - }, - { - "title": "Como retirar a oferta?", - "content": "Caso você desista da sua oferta, você pode invalidar sua ordem de venda e impedir um novo ‘lock’ na rede." - } - ] - } -] \ No newline at end of file +[ + { + "name": "1. Como Começar", + "items": [ + { + "title": "O que é uma carteira (wallet)?", + "content": "Cripto-wallet é um software que armazena criptomoedas e criptoativos de forma segura. Existem também dispositivos físicos chamados de cold/hard wallets. Com a carteira-cripto você consegue comprar e vender tokens sem a necessidade de uma corretora (exchange), por exemplo. Cripto-ativos não ficam de fato armazenados nessa carteira, mas sim as informações que possibilitam acessá-los numa blockchain, como suas chaves pública e privada.\n
\n\n* **O que é um endereço de carteira (wallet address)?**\n Sequência alfanumérica que permite que você envie e receba suas criptomoedas em segurança. Por exemplo: 3J98t1WpEZ73CNmQviecrnyiWrnqRhWNLy.\n\n* **Como conectar sua carteira ao p2pix?**\n Clique em 'Conectar Carteira'. Escolha qual wallet ou ponte (bridge) utilizará para se conectar (MetaMask ou WalletConnect). Ao clicar, sua carteira se abrirá. Caso seja seu 1º acesso, certifique-se de que permitiu sua carteira a se conectar com nossa plataforma. \n\n* **Como instalar MetaMask no Google Chrome?** \n MetaMask é uma web3 wallet que pode ser adicionada como extensão no seu browser (navegador). Para instalar esse plugin (add-on) no Google Chrome, basta você acessar a Chrome Web Store e pesquisar “MetaMask”. Certifique-se de que é a versão legítima da carteira pelo número de downloads (bastante alto, pois é a maior cold wallet da web3), então é só clicar em “Adicionar ao Chrome”. Depois da instalação ser concluída, basta seguir o passo-a-passo proposto na interface da MetaMask para a criação da conta, login e senha. O caminho para a instalação em outros browsers como Firefox, Opera, entre outros navegadores, é o mesmo. \n\n
\nNota: Não esqueça de guardar sua seed phrase em um local seguro! Sem ela é impossível recuperar o acesso à sua carteira (caso perca sua senha) e também aos seus cripto ativos, eles serão perdidos - literalmente - para sempre.\n" + }, + { + "title": "O que é uma rede (network)?", + "content": "Criptomoedas são transacionadas em redes de computadores, nas blockchains é que ficam armazenadas as informações sobre suas transações, não em um servidor. Existem [diversas redes no ecossistema cripto](https://www.gemini.com/cryptopedia/blockchain-technology-explained), como a rede do Bitcoin, da Ethereum, para citar as duas mais conhecidas. \n
\n\n* **Como selecionar a rede?**\nVocê deve ficar atento a rede que está selecionada em sua carteira. Na MetaMask, escolha a você escolhe a rede que vai operar clicando na primeira caixa ao lado do seu avatar:\n![Image Ethereum](/src/assets/faqEthereum.jpeg)\nCaso você copie um endereço na sua MetaMask estando selecionada a Rede Ethereum Mainnet e queira operar na Polygon, seus cripto ativos serão perdidos. \n\n* **O que é taxa de rede (gas fee)?**\nCusto de transação do blockchain. Você paga essa taxa para a rede que vai remunerar os validadores. É uma forma de incentivar os validadores a dar continuidade nos seus serviços. " + } + ] + }, + { + "name": "2. Comprar tokens", + "items": [ + { + "title": "Como comprar?", + "content": "1. Conectar wallet (MetaMask ou WalletConnect)\n2. Digitar amount (quantidade);\n3. Solicitar token (criptomoeda);\n4. Identificar vendedor (da lista de pessoas);\n * Escanear QRCode (ou acrescenta chave manualmente);\n * Colar e2eID (identificação end-to-end) a.k.a. código de identificação (API Pix / comprovante bancário);\n5. Receber na carteira (wallet conectada." + }, + { + "title": "O que é uma stablecoin?", + "content": "É uma criptomoeda com lastro em moeda fiduciária (por exemplo, Real brasileiro ou Dólar americando). Cada stablecoin gerada por um projeto emissor tem a mesma quantidade em reserva da moeda fiduciária em seu caixa. Alguns exemplos de stablecoins pareadas com dólar americano são USDt, DAI, USDc. Já vinculadas ao preço do Real são BRZ, MBRL e cREAL.\n
\n\n* **O que é o BRZ?**\n [BRZ](https://www.brztoken.io/) é a sigla para Brazilian Digital Token. É um tipo de criptomoeda que tem valor pareado com o Real (BRL). Ou seja, 1 BRZ tem valor igual a 1 BRL." + }, + { + "title": "De quem estou comprando?", + "content": "Vendedores fazem as ofertas e indicam a chave-Pix que irão receber o valor transacionado. Essa oferta fica travada no smart contract até que as transações sejam concluídas e você possa fazer o saque dos seus tokens. \n\n
\n\n* **Onde encontrar comprovante do Pix?**\n Quando você faz um Pix um comprovante é gerado automaticamente para o pagador e para o recebedor. Esse comprovante pode ser acessado no momento da transação via app/site do banco ou pelo seu extrato bancário convencional.\n* **Para onde vão os tokens que eu comprei?**\n Os tokens comprados terão como destino a carteira que você conectou ao p2pix. \n Nota: Lembre-se sempre de configurar a sua carteira na rede correta em que quer receber seus tokens. " + } + ] + }, + { + "name": "3. Vender tokens", + "items": [ + { + "title": "Como vender?", + "content": "1. Enviar tokens;\n2. Indique sua chave-Pix;\n3. Criar [whitelist](https://academy.binance.com/en/glossary/whitelist) onde quer receber isso;\n4. Withdraw (saque) para remoção dos tokens;\n5. Lock (trava de 24h) para esperar transações antes dos saques.\n" + }, + { + "title": "O que é aprovar tokens?", + "content": "Aprovações de tokens funcionam como permissões de sua carteira a um determinado [dApp](https://ethereum.org/en/developers/docs/dapps/) para movimentar os tokens. Ao aprovar tokens, você permite que nosso contrato inteligente acesse e execute as transações na sua carteira web3." + }, + { + "title": "O que é o lock na rede?", + "content": "\"Travamento\" na rede é uma forma de especificar um tempo para retirada dos ativos digitais. O contrato inteligente do p2pix 'trava' os tokens enviados para a rede por 24 horas. Só depois de transcorridas essas 24h que o saque dos tokens estará liberado. Isso ocorre para garantir uma transação segura para os vendedores." + }, + { + "title": "Como retirar a oferta?", + "content": "Caso você desista da sua oferta, você pode invalidar sua ordem de venda e impedir um novo ‘lock’ na rede." + } + ] + } +] diff --git a/src/utils/files/isbpList.json b/src/utils/files/isbpList.json index dc7e446..7cdaf42 100644 --- a/src/utils/files/isbpList.json +++ b/src/utils/files/isbpList.json @@ -2139,4 +2139,4 @@ "ISPB": "02318507", "longName": "BANCO KEB HANA DO BRASIL S.A." } -] \ No newline at end of file +]