react-celo
A maneira mais fácil de acessar ContractKit em suas aplicações React.
react-celo
A maneira mais fácil de acessar [Celo](https://www. npmjs. com/package/@celo/contractkit) em suas aplicações React 🔥. react-celo
é um React hook para gerenciar o acesso ao Celo com um sistema modal interno para conectar à carteira de usuários escolhida.
Agora seu DApp pode ser disponibilizado para todos no ecossistema Celo desde usuários da Valora a usuários de Ledger auto-privados.
Por padrão, o react-celo é estilizado para que você possa soltá-lo em seu aplicativo e pronto, no entanto, é totalmente personalizável para que você possa manter um UX consistente em todo o aplicativo.
Tabela de conteúdos
Instalar
yarn add @celo/react-celo @celo/contractkit
Carteiras suportadas
- Celo Dance
- Celo Extension Wallet (Metamask fork)
- Celo Terminal
- Celo Wallet
- Ledger
- MetaMask
- Chave privada em texto simples
- Omni
- Valora
- WalletConnect
Utilização Básica
Envolva seu aplicativo com o CeloProvider
react-celo usa Context.Provider sob o hood para injetar estado em todo o aplicativo. Você precisa ter certeza de que sua aplicação esteja envolvida com o provedor para poder acessar todos os provedores de react-celo.
import { CeloProvider } from "@celo/react-celo";
import "@celo/react-celo/lib/styles.css";
function WrappedApp() {
return (
<CeloProvider
dapp={{
name: "My awesome dApp",
description: "My awesome description",
url: "https://example.com",
}}
>
<App />
</CeloProvider>
);
}
function App() {
// your application code
}
Carteira padrão e personalização
react-celo fornece uma lista de carteiras padrão (CeloExtensionWallet, Injetada, Ledger, MetaMask, PrivateKey (somente dev) e WalletConnect). Ele pode ser configurado como mostrado abaixo.
<CeloProvider
dapp={{
name: "My awesome dApp",
description: "My awesome description",
url: "https://example.com",
}}
connectModal={{
// This options changes the title of the modal and can be either a string or a react element
title: <span>Connect your Wallet</span>,
providersOptions: {
// This option hides specific wallets from the default list
hideFromDefaults: [
SupportedProvider.MetaMask,
SupportedProvider.PrivateKey,
SupportedProvider.CeloExtensionWallet,
SupportedProvider.Valora,
],
// This option hides all default wallets
hideFromDefaults: true,
// This option toggles on and off the searchbar
searchable: true,
},
}}
>
<App />
</CeloProvider>
Você também pode adicionar novas carteiras personalizadas que não existem no registro ou não estão em nossos padrões. Por enquanto, só suportamos carteiras personalizadas que implementam o protocolo de walletconnect, mas mais podem vir no futuro. No exemplo abaixo, estamos ocultando todas as carteiras, exceto uma nova carteira personalizada.
<CeloProvider
dapp={{
name: "My awesome dApp",
description: "My awesome description",
url: "https://example.com",
}}
// Use the theme to customize the colors.
// If you provide a theme, you must provide all values below!
theme={{
primary: "#6366f1",
secondary: "#eef2ff",
text: "#000000",
textSecondary: "#1f2937",
textTertiary: "#64748b",
muted: "#e2e8f0",
background: "#ffffff",
error: "#ef4444",
}}
connectModal={{
title: <span>Connect your ExampleWallet</span>,
providersOptions: {
hideFromDefaults: true,
additionalWCWallets: [
// see https://github.com/WalletConnect/walletconnect-registry/#schema for a schema example
{
id: "example-wallet",
name: "Example Wallet",
description: "Lorem ipsum",
homepage: "https://example.com",
chains: ["eip:4220"],
// IMPORTANT
// This is the version of WC. Suportamos apenas a versão 1 no momento.
versions: ["1"],
logos: {
sm: "https://via.placeholder.com/40/000000/FFFFFF",
md: "https://via.placeholder.com/80/000000/FFFFFF",
lg: "https://via.placeholder.com/160/000000/FFFFFF",
},
app: {
browser: "...",
ios: "...",
android: "...",
mac: "...",
windows: "..",
linux: "...",
},
mobile: {
native: "...",
universal: "...",
},
desktop: {
native: "...",
universal: "...",
},
metadata: {
shortName: "...",
colors: {
primary: "...",
secondary: "...",
},
},
responsive: {
mobileFriendly: true,
browserFriendly: true,
mobileOnly: false,
browserOnly: false,
},
},
],
},
}}
>
<App />
</CeloProvider>
Solicitar que os usuários conectem a sua carteira
react-celo fornece uma função de connect
que abrirá uma lista de carteiras com as quais seu usuário pode se conectar.
import { useCelo } from "@celo/react-celo";
function App() {
const { connect, address } = useCelo();
return (
<>
{address ? (
<div>Connected to {address}</div>
) : (
<button onClick={connect}>Connect wallet</button>
)}
</>
);
}
Após se conectar a uma conta, a propriedade address
será definida.
Use ContractKit para ler os dados em cadeia
Agora que nos conectamos a uma conta e temos o endereço de usuários, podemos usar o kit `` para consultar dados on-chain:
import { useCelo } from '@celo/react-celo';
function App() {
const { kit, address } = useCelo();
async function getAccountSummary() {
const accounts = await kit.contracts.getAccounts();
await accounts.getAccountSummary(address);
}
return (
...
)
}
Acessando contas de usuário
O maior problema ao desenvolver DApps é garantir uma experiência de nível Web2, enquanto gerencia o flaky e, muitas vezes, a natureza lenta das blockchains. Para esse fim, nós projetamos react-celo de uma maneira de abstrair a maior parte da dor.
Inicialmente conectar a uma conta de usuários é uma coisa, manipulado pela função de connect
que acabamos de mencionar. No entanto, assim que um usuário tiver se conectado ao seu DApp uma vez que pudermos tornar a experiência mais agradável para eles em visitas de repetição.
Última conta conectada
react-celo irá lembrar o último endereço conectado de um usuário quando ele voltar ou atualizar seu DApp. Certifique-se de que ao desenvolver seu DApp nada muda na interface do usuário, independentemente de o usuário ter ou não um conjunto de propriedades de kit.defaultAccount
.
import { useCelo } from "@celo/react-celo";
const { address } = useCelo();
Obtenha uma conta conectada
Quando um usuário atualiza ou navega de volta à sua página, ele pode não ter mais uma conta conectada. No entanto, nós não precisamos incentivá-los a logar novamente, apenas para ver a página, isso só pode ser feito ao fazer uma ação.
Para essa funcionalidade temos os métodos de performActions
e getConnectedKit
. O uso se parece um pouco com isso para getConnectedKit
:
import { useCelo } from "@celo/react-celo";
function App() {
const { getConnectedKit } = useCelo();
async function transfer() {
const kit = await getConnectedKit();
const cUSD = await kit.contracts.getStableToken();
await cUSD.transfer("0x...", 10000).sendAndWaitForReceipt();
}
return <button onClick={transfer}>Transfer</button>;
}
e isso para performActions
:
import { useCelo } from "@celo/react-celo";
function App() {
const { performActions } = useCelo();
async function transfer() {
await performActions(async (kit) => {
const cUSD = await kit.contracts.getStableToken();
await cUSD.transfer("0x...", 10000).sendAndWaitForReceipt();
});
}
return <button onClick={transfer}>Transfer</button>;
}
O método performActions
também cuidará de exibir um modal para o usuário, dizendo para ele confirmar quaisquer ações em sua carteira conectada.
Gerenciamento de rede
react-celo fornece uma variávelnetwork
e uma função updateNetwork
que você pode usar para exibir a rede atualmente conectada, bem como mudar para uma diferente. (Alfajores, Baklava ou Mainnet).
Se você prefere que seu DApp acesse apenas uma rede específica (talvez você esteja implantando seu site testnet em https://test-app.dapp. Nome
e sua versão mainnet em https://app.dapp. O nome
) que você pode passar a rede que deseja usar como variável no provedor com o qual você implementa seu aplicativo com:
Você também pode passar em uma propriedade network
para o CeloProvider
como a rede inicial padrão
walletChainId vs network
useCelo
retorna duas propriedades. rede, um objeto com nome, chainId e url rpc é com qual cadeia / rede o dapp está se comunicando. walletChainId
é a chainID à qual a carteira/assinante está conectada (assumindo que este é um conceito que tem) ou será nulo, a menos que o modo de rede manual esteja ativado, eles eventualmente serão consistentes ou walletChainId será nulo.
import { CeloProvider, Alfajores, NetworkNames } from '@celo/react-celo';
function WrappedApp({ Component, pageProps }) {
return (
<CeloProvider
...
networks={[Alfajores]}
network={{
name: NetworkNames.Alfajores,
rpcUrl: 'https://alfajores-forno.celo-testnet.org',
graphQl: 'https://alfajores-blockscout.celo-testnet.org/graphiql',
explorer: 'https://alfajores-blockscout.celo-testnet.org',
chainId: 44787,
}}
>
<App />
</CeloProvider>
);
}
function App () {
...
}
Certifique-se de verificar o aplicativo de exemplo react-celo para uma demonstração de como o gerenciamento de redes funciona com mais profundidade. Geralmente você vai querer mostrar uma lista suspensa para os usuários, permitindo-lhes selecionar a rede a se conectar.
import { useCelo } from "@celo/react-celo";
function App() {
const { network, updateNetwork } = useCelo();
return <div>Currently connected to {network}</div>;
}
Estendendo Redes Suportadas
Por padrão Use-Contractkit suporta apenas redes de Blockchain de Celo. No entanto, você pode estender isso para incluir outras cadeias que você escolher como Ethereum, Polygon, Avalanche etc Passando sua matriz de Network
s para CeloProvider
. Note que este recurso é considerado experimental e funciona melhor com carteiras como Metamask.
Modo de rede manual
Opte por sair do React-Celo trocando automaticamente em qual rede o dapp / carteira estão ligadas. walletChainId
pode ser diferente do dapp network.chainId
. Você PRECISA usar updateNetwork
para definir a cadeia desejada neste caso.
Ajusta FeeCurrency
react-celo fornece uma variável feeCurrency
e uma função updateFeeCurrency
que você pode usar para exibir a Moeda Feira atualmente selecionada (cUSD, CELO, cEUR). A feeCurrency também pode ser passada para o componente do provedor. Valores válidos são CeloContract.GoldToken
, CeloContract.StableToken
, CeloContract.StableTokenEUR
. O CeloContract pode ser importado assim:
import { CeloTokenContract } from '@celo/contractkit'
Temas e Modo escuro
Atualmente, react-celo suporta o modo escuro e claro (também conhecido como padrão), para usar o modal no modo escuro basta adicionar a classe tw-dark
na raiz <html />
da página da web.
Se você não tiver um estilo padrão ao seu gosto, você pode fornecer um objeto de tema definido como tal. Você pode fazê-lo durante a configuração do seu dapp, no nível Provider
. Ou em tempo real (digamos, se seus usuários podem alterar o tema do seu dapp), através de updateTheme
.
interface Theme {
primary: string;
secondary: string;
text: string;
textSecondary: string;
textTertiary: string;
muted: string;
background: string;
error: string;
}
Log e depuração
Nós logamos por padrão debug
ou superior no modo de desenvolvimento. É determinado pelas suas variáveis de ambiente: definindo DEBUG
como true
ou definindo NODE_ENV
para outra como production
). No modo de production , registramos apenas erro
.
Mas você pode fornecer seu próprio registrador ao nível do provedor. Ele deve implementar nossa ILogger
interface que se parece com isso:
interface ILogger {
debug(...args: unknown[]): void;
log(...args: unknown[]): void;
warn(...args: unknown[]): void;
error(...args: unknown[]): void;
}
Desenvolvimento
Para executar todos os pacotes localmente de uma vez, basta clonar este repositório e executar:
yarn;
yarn build; #only needs to be run the first time
yarn dev;
Um servidor de recarregamento quente deve aparecer no localhost:3000, é exatamente o mesmo que em react-celo-c-labs.vercel.app.
Como alternativa, você pode executar individualmente react-celo
e o app example
em paralelo.
Para isso, você ainda precisa executar yarn
na raiz.
Então, você pode executar react-celo
em uma aba:
cd packages/react-celo
yarn dev
e execute o aplicativo example
em outro:
cd packages/example
yarn dev
Suporte
Algum problema com qualquer coisa relacionada ao react-celo? Vá para o GitHub Discussions ou celo-org canal e peça ajuda a qualquer momento.
Guias
Informações mais especializadas de uso pode ser encontrada em nossos Guias