Usando o Kit
A seguir alguns exemplos de recursos do ContractKit
, supondo que já esteja conectado a um nó. Se você não estiver conectado, aqui está uma atualização.
Configuração padrão de opções Tx
kit
permite que você defina as opções padrão de transação:
import { CeloContract } from "@celo/contractkit";
let accounts = await kit.web3.eth.getAccounts();
kit.defaultAccount = accounts[0];
// paid gas in cUSD
await kit.setFeeCurrency(CeloContract.StableToken);
Define a feeCurrency
para uma transação
Você pode definir a feeCurrency
para cada transação individualmente definindo o campo feeCurrency
no método .send()
. A feeCurrency
aceita endereços de contrato de moedas de taxa.
let cUSDcontract = await kit.contracts.getStableToken();
let cUSDtx = await cUSDcontract
.transfer(someAddress, amount)
.send({ feeCurrency: cUSDcontract.address });
Obtendo o Saldo Total
Este método do kit
retornará o CELO, CELO bloqueado, cUSD e saldo total do endereço
let totalBalance = await kit.getTotalBalance(myAddress);
Implementar um contrato
Implantar um contrato com a conta padrão já definida. Simplesmente envie uma transação sem um campo to:
. Veja mais sobre o envio de transações customizadas abaixo.
Você pode verificar a implantação no explorador de blocos Alfajores aqui. Aguarde o recibo e registre-o para obter detalhes da transação.
let bytecode = "0x608060405234..."; // compiled Solidity deployment bytecode
let tx = await kit.sendTransaction({
data: bytecode,
});
let receipt = tx.waitReceipt();
console.log(receipt);
Enviando Transações Customizadas
O objeto de transação Celo não é o mesmo que o da Ethereum. There is a new optional field present:
feeCurrency
(address of the ERC20 contract to use to pay for gas)
feeCurrency
permite que as taxas de transação sejam pagas em moedas que não sejam CELO. As moedas com as quais as taxas são suportadas são CELO, USD e cEUR. Você pode especificar a moeda passando o endereço do contrato da moeda em que deseja que as taxas de transação sejam pagas.
Celo também aceita transações de tipo de Ethereum originais, por isso você pode usar ferramentas de assinatura da Ethereum (como Metamask), bem como carteiras e ferramentas específicas do Celo e da carteira. Você pode ler mais sobre esses formatos de transação em CIP 35.
Para uma transação bruta:
const tx = kit.sendTransaction({
from: myAddress,
to: someAddress,
value: oneGold,
});
const hash = await tx.getHash();
const receipt = await tx.waitReceipt();
Ao interagir com um objeto de contrato Web3:
const goldtoken = await kit._web3Contracts.getGoldToken();
const oneGold = kit.web3.utils.toWei("1", "ether");
const txo = await goldtoken.methods.transfer(someAddress, oneGold);
const tx = await kit.sendTransactionObject(txo, { from: myAddress });
const hash = await tx.getHash();
const receipt = await tx.waitReceipt();
Interagindo com contratos personalizados
Você pode usar ContratoKit para interagir com qualquer contrato inteligente implantado, desde que você tenha o endereço do contrato e o ABI. Para fazer isso, você irá inicializar uma nova instância de contrato web3.
. Em seguida, pode chamar funções na instância do contrato para ler o estado ou enviar transações para atualizar o contrato. Você pode ver alguns trechos de código abaixo. Para um exemplo mais abrangente, consulte a Interagir com Contratos Personalizados seção de Implantar um código de Contrato.
let cUSDcontract = await kit.contracts.getStableToken();
let contract = new kit.connection.web3.eth.Contract(ABI, address); // Init a web3.js contract instance
let name = await instance.methods.getName().call(); // Read contract state
// Especificar a conta 'from' e 'feeCurrency' é opcional
// As transações com um campo feeCurrency não especificado terão como padrão o pagamento de taxas no CELO
const tx = await instance.methods
.setName(newName)
.send({ from: account.address, feeCurrency: cUSDcontract.address });
Vender CELO apenas se a taxa for favorável
// Este é um preço mais baixo que aceitarei em cUSD para cada CELO
const favorableAmount = 100;
const amountToExchange = kit.web3.utils.toWei("10", "ether");
const oneGold = kit.web3.utils.toWei("1", "ether");
const exchange = await kit.contracts.getExchange();
const amountOfcUsd = await exchange.quoteGoldSell(oneGold);
if (amountOfcUsd > favorableAmount) {
const goldToken = await kit.contracts.getGoldToken();
const approveTx = await goldToken
.approve(exchange.address, amountToExchange)
.send();
const approveReceipt = await approveTx.waitReceipt();
const usdAmount = await exchange.quoteGoldSell(amountToExchange);
const sellTx = await exchange.sellGold(amountToExchange, usdAmount).send();
const sellReceipt = await sellTx.waitReceipt();
}
Posso comprar todos os CELO com cUSD na minha conta
const stableToken = await this.contracts.getStableToken();
const exchange = await this.contracts.getExchange();
const cUsdBalance = await stableToken.balanceOf(myAddress);
const approveTx = await stableToken
.approve(exchange.address, cUsdBalance)
.send();
const approveReceipt = await approveTx.waitReceipt();
const goldAmount = await exchange.quoteUsdSell(cUsdBalance);
const sellTx = await exchange.sellDollar(cUsdBalance, goldAmount).send();
const sellReceipt = await sellTx.waitReceipt();