Usando el Contract Kit

Configuración de opciones

kitle permite configurar opciones de transacción predeterminadas:

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);

Configurado feeCurrencypara una transacción

Puede configurar feeCurrencypara cada transacción individualmente configurando el feeCurrencycampo en el .send()método. El feeCurrencycampo acepta direcciones de contrato de monedas de tarifa incluidas en la lista blanca.

let cUSDcontract = await kit.contracts.getStableToken();
let cUSDtx = await cUSDcontract
  .transfer(someAddress, amount)
  .send({ feeCurrency: cUSDcontract.address });

Obtener el saldo

Este método kitdevolverá el CELO, el CELO bloqueado, el cUSD y el saldo total de la dirección.

let totalBalance = await kit.getTotalBalance(myAddress);

Implementar un contrato

Implementar un contrato con la cuenta predeterminada ya configurada. Simplemente envíe una transacción sin to:campo. Vea más sobre el envío de transacciones personalizadas a continuación.

Puede verificar la implementación en el explorador de bloques de Alfajores aquí . Espere el recibo y regístrelo para obtener los detalles de la transacción.

let bytecode = "0x608060405234..."; // compiled Solidity deployment bytecode

let tx = await kit.sendTransaction({
  data: bytecode,
});

let receipt = tx.waitReceipt();
console.log(receipt);

Envío de transacciones

El objeto de transacción de Celo no es el mismo que el de Ethereum. Hay un nuevo campo opcional presente:

  • feeCurrency(dirección del contrato ERC20 a utilizar para pagar el gas)

feeCurrencypermite pagar las tarifas de transacción en monedas distintas a CELO. Las monedas de tarifa admitidas actualmente son CELO, cUSD y cEUR. Puede especificar la moneda pasando la dirección del contrato de la moneda en la que desea que se paguen las tarifas de transacción.

Celo también acepta transacciones originales de tipo Ethereum, por lo que puede utilizar herramientas de firma de Ethereum (como Metamask), así como carteras y herramientas específicas de Celo. Puede leer más sobre estos formatos de transacciones en CIP 35 .

Para una transacción sin procesar:

const tx = kit.sendTransaction({
  from: myAddress,
  to: someAddress,
  value: oneGold,
});
const hash = await tx.getHash();
const receipt = await tx.waitReceipt();

Al interactuar con un 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();

Interactuar con contratos

Puede utilizar ContractKit para interactuar con cualquier contrato inteligente implementado, siempre que tenga la dirección del contrato y la ABI . Para hacerlo, inicializará una nueva web3instancia de Contrato. Luego puede llamar funciones en la instancia del contrato para leer el estado o enviar transacciones para actualizar el contrato. Puede ver algunos fragmentos de código a continuación. Para obtener un ejemplo más completo, consulte la sección Interactuar con contratos personalizados del ejemplo de código Implementar un 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

// Specifying the 'from' account and 'feeCurrency' is optional
// Transactions with an unspecified feeCurrency field will default to paying fees in CELO
const tx = await instance.methods
  .setName(newName)
  .send({ from: account.address, feeCurrency: cUSDcontract.address });

Vender CELO sólo si la tasa es favorable

// This is at lower price I will accept in cUSD for every 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();
}

Comprando todos los CELO que puedo, con los cUSD en mi cuenta

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();

Last updated