diff --git a/packages/cli/package.json b/packages/cli/package.json index 514c6c7af..3ac4c59a9 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -32,7 +32,7 @@ "test": "TZ=UTC yarn jest --runInBand" }, "dependencies": { - "@celo/abis": "10.0.0", + "@celo/abis": "canary", "@celo/base": "^6.0.0", "@celo/connect": "^5.1.1", "@celo/contractkit": "^6.0.1-beta.0", diff --git a/packages/cli/src/commands/account/balance.ts b/packages/cli/src/commands/account/balance.ts index 528193f88..78d9e4b36 100644 --- a/packages/cli/src/commands/account/balance.ts +++ b/packages/cli/src/commands/account/balance.ts @@ -25,6 +25,7 @@ export default class Balance extends BaseCommand { const kit = await this.getKit() const { args, flags } = await this.parse(Balance) + // TODO: Consider what happens if the contract has 6 decimals console.log('All balances expressed in units of 10^-18.') printValueMap(await kit.getTotalBalance(args.arg1 as string)) if (flags.erc20Address) { diff --git a/packages/cli/src/commands/exchange/$usdc.ts b/packages/cli/src/commands/exchange/$usdc.ts new file mode 100644 index 000000000..efda162e8 --- /dev/null +++ b/packages/cli/src/commands/exchange/$usdc.ts @@ -0,0 +1,28 @@ +import { StableToken } from '@celo/contractkit' +import ExchangeStableBase from '../../exchange-stable-base' +import { CustomFlags } from '../../utils/command' +export default class ExchangeReals extends ExchangeStableBase { + static description = 'Exchange Circle USD Coin ($USDC) for CELO via the stability mechanism' + + static flags = { + ...ExchangeStableBase.flags, + from: CustomFlags.address({ + required: true, + description: 'The address with Circle USD Coin ($USDC) to exchange', + }), + value: CustomFlags.wei({ + required: true, + description: 'The value of Circle USD Coin ($USDC) to exchange for CELO', + }), + } + + static examples = [ + 'reals --value 10000000000000 --from 0xc1912fEE45d61C87Cc5EA59DaE31190FFFFf232d', + 'reals --value 10000000000000 --forAtLeast 50000000000000 --from 0xc1912fEE45d61C87Cc5EA59DaE31190FFFFf232d', + ] + + async init() { + this._stableCurrency = StableToken.$USDC + await super.init() + } +} diff --git a/packages/cli/src/commands/network/contracts.ts b/packages/cli/src/commands/network/contracts.ts index 11f4e381a..072265014 100644 --- a/packages/cli/src/commands/network/contracts.ts +++ b/packages/cli/src/commands/network/contracts.ts @@ -13,6 +13,7 @@ const UNVERSIONED_CONTRACTS = [ CeloContract.StableToken, CeloContract.StableTokenBRL, CeloContract.StableTokenEUR, + CeloContract.StableToken$USDC, ] const UNPROXIED_CONTRACTS: CeloContract[] = [] diff --git a/packages/cli/src/commands/transfer/$usdc.ts b/packages/cli/src/commands/transfer/$usdc.ts new file mode 100644 index 000000000..0d8b8ea30 --- /dev/null +++ b/packages/cli/src/commands/transfer/$usdc.ts @@ -0,0 +1,19 @@ +import { StableToken } from '@celo/contractkit' +import { TransferStableBase } from '../../transfer-stable-base' + +export default class TransferUSDCoin extends TransferStableBase { + static description = 'Transfer Circle USD Coin ($USDC) to a specified address.' + + static flags = { + ...TransferStableBase.flags, + } + + static examples = [ + '$usdc --from 0xa0Af2E71cECc248f4a7fD606F203467B500Dd53B --to 0x5409ed021d9299bf6814279a6a1411a7e866a631 --value 1000000000000000000', + ] + + async init() { + this._stableCurrency = StableToken.$USDC + await super.init() + } +} diff --git a/packages/cli/src/commands/transfer/reals.ts b/packages/cli/src/commands/transfer/reals.ts index a84e30457..8754b6c28 100644 --- a/packages/cli/src/commands/transfer/reals.ts +++ b/packages/cli/src/commands/transfer/reals.ts @@ -1,7 +1,7 @@ import { StableToken } from '@celo/contractkit' import { TransferStableBase } from '../../transfer-stable-base' -export default class TransferEuros extends TransferStableBase { +export default class TransferReals extends TransferStableBase { static description = 'Transfer Celo Brazilian Real (cREAL) to a specified address.' static flags = { diff --git a/packages/sdk/base/README.MD b/packages/sdk/base/README.MD index fdf32a7b3..26d9c89f4 100644 --- a/packages/sdk/base/README.MD +++ b/packages/sdk/base/README.MD @@ -1,24 +1,26 @@ - # @celo/base This package contains shared classes and functions used by other celo packages. It was designed to have minimal external dependencies. (for shared celo functions that have big external dependencies see the @celo/utils, @celo/cryptographic-utils, @celo/phone-utils, @celo/network-utils packages) - ## Notable Types ```typescript // enums StableTokens and Token are enums, CeloTokenType is the type that must be one of the 2 enums -import { StableTokens, Token, CeloTokenType } from "@celo/base" +import { StableTokens, Token, CeloTokenType } from '@celo/base' StableTokens.cUSD +StableTokens.cEUR + StableTokens.cREAL +StableTokens.$USDC + Token.CELO ``` ## Notable Functions ```typescript -import { eqAddress, normalizeAddress, isNullAddress } from "@celo/base" +import { eqAddress, normalizeAddress, isNullAddress } from '@celo/base' ``` diff --git a/packages/sdk/base/src/currencies.ts b/packages/sdk/base/src/currencies.ts index 2bfbd8788..f1956508b 100644 --- a/packages/sdk/base/src/currencies.ts +++ b/packages/sdk/base/src/currencies.ts @@ -3,12 +3,14 @@ export enum CURRENCY_ENUM { GOLD = 'Celo Gold', DOLLAR = 'Celo Dollar', EURO = 'Celo Euro', + $USDC = 'USD Coin', } export enum StableToken { cUSD = 'cUSD', cEUR = 'cEUR', cREAL = 'cREAL', + $USDC = '$USDC', } export enum Token { @@ -42,6 +44,12 @@ export const CURRENCIES: CurrencyObject = { code: 'cEUR', displayDecimals: 2, }, + // NOTE: should we just get rid of CURRENCIES + [CURRENCY_ENUM.$USDC]: { + symbol: '$', + code: 'USDC', + displayDecimals: 2, + }, } export const resolveCurrency = (label: string): CURRENCY_ENUM => { @@ -57,6 +65,7 @@ export const resolveCurrency = (label: string): CURRENCY_ENUM => { } } +// NOTE: should we just get rid of SHORT_CURRENCIES /** @deprecated use StableToken and Token */ export enum SHORT_CURRENCIES { DOLLAR = 'dollar', diff --git a/packages/sdk/contractkit/MIGRATION-TO-ETHERS.md b/packages/sdk/contractkit/MIGRATION-TO-ETHERS.md index 55d68442a..c6c9f7ae6 100644 --- a/packages/sdk/contractkit/MIGRATION-TO-ETHERS.md +++ b/packages/sdk/contractkit/MIGRATION-TO-ETHERS.md @@ -73,10 +73,9 @@ async function getToken(token: string) { } async function CeloTokens(): Promise<[string, string][]> { return Promise.all( - ['GoldToken', 'StableToken', 'StableTokenEUR', 'StableTokenBRL'].map(async (token) => [ - token, - await getToken(token), - ]) + ['GoldToken', 'StableToken', 'StableTokenEUR', 'StableTokenBRL', 'StableToken$USDC'].map( + async (token) => [token, await getToken(token)] + ) ) } ``` diff --git a/packages/sdk/contractkit/MIGRATION-TO-VIEM.md b/packages/sdk/contractkit/MIGRATION-TO-VIEM.md index 494f158ce..cc971dfff 100644 --- a/packages/sdk/contractkit/MIGRATION-TO-VIEM.md +++ b/packages/sdk/contractkit/MIGRATION-TO-VIEM.md @@ -111,10 +111,9 @@ const registryContract = getContract({ async function CeloTokens(): Promise<[string, string][]> { return Promise.all( - ['GoldToken', 'StableToken', 'StableTokenEUR', 'StableTokenBRL'].map(async (token) => [ - token, - await registryContract.read.getAddressForString(token), - ]) + ['GoldToken', 'StableToken', 'StableTokenEUR', 'StableTokenBRL', 'StableToken$USDC'].map( + async (token) => [token, await registryContract.read.getAddressForString(token)] + ) ) } ``` @@ -200,28 +199,28 @@ const stages = (await publicClient.multicall({ contracts: stageCalls })).map((x) With Viem's built in Celo transaction serializer and Celo block/transaction formatters it is easy to build a wallet that supports Celo's ability to pay gas fees with various erc20 tokens. Simply, import a Celo chain from `viem/chain` and pass it to Viem's `createWalletClient`. Once the client is created you can add the feeCurrency field to your transaction with the address of the token you want to use for gas. ```ts - import { celo } from 'viem/chains' - import { createWalletClient, privateKeyToAccount, type SendTransactionParameters, http } from 'viem' +import { celo } from 'viem/chains' +import { createWalletClient, privateKeyToAccount, type SendTransactionParameters, http } from 'viem' - const account = privateKeyToAccount(PRIVATE_KEY) +const account = privateKeyToAccount(PRIVATE_KEY) - // ALFAJORES ADDRESS: Celo Mainnet can be fetched from the registry - const cUSDAddress = '0x874069Fa1Eb16D44d622F2e0Ca25eeA172369bC1' +// ALFAJORES ADDRESS: Celo Mainnet can be fetched from the registry +const cUSDAddress = '0x874069Fa1Eb16D44d622F2e0Ca25eeA172369bC1' - const localAccountClient = createWalletClient({ - account, - chain: celo, - }) +const localAccountClient = createWalletClient({ + account, + chain: celo, +}) - const sendTransaction = (tx: SendTransactionParameters) => { - return localAccountClient.sendTransaction(tx) - } +const sendTransaction = (tx: SendTransactionParameters) => { + return localAccountClient.sendTransaction(tx) +} - const hash = await sendTransaction({ - feeCurrency: cUSDAddress, - value: BigInt(100000000), - to: '0x22579CA45eE22E2E16dDF72D955D6cf4c767B0eF', - }) +const hash = await sendTransaction({ + feeCurrency: cUSDAddress, + value: BigInt(100000000), + to: '0x22579CA45eE22E2E16dDF72D955D6cf4c767B0eF', +}) ``` ### Further reading diff --git a/packages/sdk/contractkit/README.md b/packages/sdk/contractkit/README.md index 753a2b856..94110f56e 100644 --- a/packages/sdk/contractkit/README.md +++ b/packages/sdk/contractkit/README.md @@ -43,26 +43,22 @@ const kit = newKit('https://alfajores-forno.celo-testnet.org') To access balances: ```ts -// returns an object with {lockedGold, pending, cUSD, cEUR, cREAL} +// returns an object with {lockedGold, pending, cUSD, cEUR, cREAL, $USDC} const balances = await kit.getTotalBalance() -// returns an object with {cUSD, cEUR, cREAL} +// returns an object with {cUSD, cEUR, cREAL, $USDC} const balances = await miniKit.getTotalBalance() - ``` If you don't need the balances of all tokens use the balanceOf method -```ts +```ts const stableTokenWrapper = await kit.getStableToken(StableToken.cREAL) const cRealBalance = stableTokenWrapper.balanceOf(accountAddress) - ``` - - ### Setting Default Tx Options `kit` allows you to set default transaction options: @@ -107,7 +103,7 @@ To send funds: ```ts const oneGold = kit.connection.web3.utils.toWei('1', 'ether') const tx = await goldToken.transfer(someAddress, oneGold).send({ - from: myAddress + from: myAddress, }) const hash = await tx.getHash() @@ -117,7 +113,6 @@ const receipt = await tx.waitReceipt() If you would like to pay fees in cUSD, (or other cStables like cEUR, cUSD). ```ts - kit.setFeeCurrency(CeloContract.StableToken) // Default to paying fees in cUSD const stableTokenContract = kit.contracts.getStableToken() @@ -129,7 +124,6 @@ const tx = await stableTokenContract const hash = await tx.getHash() const receipt = await tx.waitReceipt() - ``` ### Interacting with Core Contracts @@ -162,8 +156,7 @@ When using the `kit` you can access core contracts like `kit.contracts.get{ContractName}` -E.G. `kit.contracts.getAccounts()`, `kit.contracts.getValidators()` - +E.G. `kit.contracts.getAccounts()`, `kit.contracts.getValidators()` #### Stand Alone Wrappers @@ -172,12 +165,11 @@ You can also initialize contracts wrappers directly. They require a `Connection` ```typescript // MiniContractKit only gives access to a limited set of Contracts, so we import Multisig -import { newKit } from "@celo/contractkit/lib/mini-kit" +import { newKit } from '@celo/contractkit/lib/mini-kit' import { MultiSigWrapper } from '@celo/contractkit/lib/wrappers/MultiSig' import { newMultiSig } from '@celo/abis/web3/MultiSig' - -const miniKit = newKit("https://alfajores-forno.celo-testnet.org/") +const miniKit = newKit('https://alfajores-forno.celo-testnet.org/') // Alternatively import { Connection } from '@celo/connect' // const connection = new Connection(web3) @@ -189,7 +181,7 @@ const multisigWrapper = new MultiSigWrapper(miniKit.connection, contract) ### Accessing web3 contract wrappers -`MiniContractKit` *does not provide access to the web3 contracts* +`MiniContractKit` _does not provide access to the web3 contracts_ Some user might want to access web3 native contract wrappers. diff --git a/packages/sdk/contractkit/package.json b/packages/sdk/contractkit/package.json index c88d0479a..a19e669da 100644 --- a/packages/sdk/contractkit/package.json +++ b/packages/sdk/contractkit/package.json @@ -24,7 +24,7 @@ "lint": "yarn run --top-level eslint -c .eslintrc.js " }, "dependencies": { - "@celo/abis": "10.0.0", + "@celo/abis": "canary", "@celo/base": "^6.0.0", "@celo/connect": "^5.1.1", "@celo/utils": "^5.0.6", diff --git a/packages/sdk/contractkit/src/base.ts b/packages/sdk/contractkit/src/base.ts index 3ae198f82..cf91eaf67 100644 --- a/packages/sdk/contractkit/src/base.ts +++ b/packages/sdk/contractkit/src/base.ts @@ -27,6 +27,7 @@ export enum CeloContract { StableToken = 'StableToken', StableTokenEUR = 'StableTokenEUR', StableTokenBRL = 'StableTokenBRL', + StableToken$USDC = 'StableToken$USDC', Validators = 'Validators', } @@ -34,6 +35,7 @@ export type StableTokenContract = | CeloContract.StableToken | CeloContract.StableTokenEUR | CeloContract.StableTokenBRL + | CeloContract.StableToken$USDC export type CeloTokenContract = StableTokenContract | CeloContract.GoldToken /** diff --git a/packages/sdk/contractkit/src/celo-tokens.ts b/packages/sdk/contractkit/src/celo-tokens.ts index 764190bd2..e9bb1344e 100644 --- a/packages/sdk/contractkit/src/celo-tokens.ts +++ b/packages/sdk/contractkit/src/celo-tokens.ts @@ -38,6 +38,10 @@ export const stableTokenInfos: { contract: CeloContract.StableTokenBRL, symbol: StableToken.cREAL, }, + [StableToken.$USDC]: { + contract: CeloContract.StableToken$USDC, + symbol: StableToken.$USDC, + }, } /** Basic info for each supported celo token, including stable tokens */ diff --git a/packages/sdk/contractkit/src/contract-cache.ts b/packages/sdk/contractkit/src/contract-cache.ts index 898307948..2617d7f9b 100644 --- a/packages/sdk/contractkit/src/contract-cache.ts +++ b/packages/sdk/contractkit/src/contract-cache.ts @@ -46,6 +46,9 @@ const WrapperFactories = { [CeloContract.StableToken]: StableTokenWrapper, [CeloContract.StableTokenEUR]: StableTokenWrapper, [CeloContract.StableTokenBRL]: StableTokenWrapper, + // TODO: use the TokenAdapter from @celo/abis@11 when it's out + // https://docs.celo.org/protocol/transaction/erc20-transaction-fees#alfajores-testnet + [CeloContract.StableToken$USDC]: StableTokenWrapper, } as const const WithRegistry = { @@ -98,6 +101,9 @@ interface WrapperCacheMap { [CeloContract.StableToken]?: StableTokenWrapper [CeloContract.StableTokenEUR]?: StableTokenWrapper [CeloContract.StableTokenBRL]?: StableTokenWrapper + // TODO: use the TokenAdapter from @celo/abis@11 when it's out + // https://docs.celo.org/protocol/transaction/erc20-transaction-fees#alfajores-testnet + [CeloContract.StableToken$USDC]?: StableTokenWrapper [CeloContract.Validators]?: ValidatorsWrapper } diff --git a/packages/sdk/contractkit/src/mini-contract-cache.ts b/packages/sdk/contractkit/src/mini-contract-cache.ts index 25c220f2f..bd6778ca4 100644 --- a/packages/sdk/contractkit/src/mini-contract-cache.ts +++ b/packages/sdk/contractkit/src/mini-contract-cache.ts @@ -1,3 +1,4 @@ +import {} from '@celo/abis' import { newGasPriceMinimum } from '@celo/abis/web3/0.8/GasPriceMinimum' import { newAccounts } from '@celo/abis/web3/Accounts' import { newGoldToken } from '@celo/abis/web3/GoldToken' @@ -40,6 +41,12 @@ const MINIMUM_CONTRACTS = { newInstance: newStableTokenEUR, wrapper: StableTokenWrapper, }, + [CeloContract.StableToken$USDC]: { + // TODO: use the TokenAdapter from @celo/abis@11 when it's out + // https://docs.celo.org/protocol/transaction/erc20-transaction-fees#alfajores-testnet + // newInstance: newStableToken$USDC, + wrapper: StableTokenWrapper, + }, } export type ContractsBroughtBase = typeof MINIMUM_CONTRACTS diff --git a/packages/sdk/contractkit/src/proxy.ts b/packages/sdk/contractkit/src/proxy.ts index a5418c6db..135381713 100644 --- a/packages/sdk/contractkit/src/proxy.ts +++ b/packages/sdk/contractkit/src/proxy.ts @@ -122,6 +122,7 @@ const initializeAbiMap = { StableTokenProxy: findInitializeAbi(StableTokenABI), StableTokenEURProxy: findInitializeAbi(StableTokenABI), StableTokenBRLProxy: findInitializeAbi(StableTokenABI), + StableToken$USDCProxy: findInitializeAbi(StableTokenABI), ValidatorsProxy: findInitializeAbi(ValidatorsABI), } diff --git a/packages/sdk/contractkit/src/web3-contract-cache.ts b/packages/sdk/contractkit/src/web3-contract-cache.ts index da802f0b9..826397e52 100644 --- a/packages/sdk/contractkit/src/web3-contract-cache.ts +++ b/packages/sdk/contractkit/src/web3-contract-cache.ts @@ -1,8 +1,4 @@ // tslint:disable: ordered-imports -import debugFactory from 'debug' -import { AddressRegistry } from './address-registry' -import { CeloContract, ProxyContracts } from './base' -import { StableToken } from './celo-tokens' import { newGasPriceMinimum } from '@celo/abis/web3/0.8/GasPriceMinimum' import { newAccounts } from '@celo/abis/web3/Accounts' import { newAttestations } from '@celo/abis/web3/Attestations' @@ -29,6 +25,10 @@ import { newSortedOracles } from '@celo/abis/web3/SortedOracles' import { newValidators } from '@celo/abis/web3/Validators' import { newReserve } from '@celo/abis/web3/mento/Reserve' import { newStableToken } from '@celo/abis/web3/mento/StableToken' +import debugFactory from 'debug' +import { AddressRegistry } from './address-registry' +import { CeloContract, ProxyContracts } from './base' +import { StableToken } from './celo-tokens' import { newMentoFeeHandlerSeller } from '@celo/abis/web3/MentoFeeHandlerSeller' import { newUniswapFeeHandlerSeller } from '@celo/abis/web3/UniswapFeeHandlerSeller' @@ -64,6 +64,7 @@ export const ContractFactories = { [CeloContract.StableToken]: newStableToken, [CeloContract.StableTokenEUR]: newStableToken, [CeloContract.StableTokenBRL]: newStableToken, + [CeloContract.StableToken$USDC]: newStableToken, [CeloContract.Validators]: newValidators, } @@ -71,6 +72,7 @@ const StableToContract = { [StableToken.cEUR]: CeloContract.StableTokenEUR, [StableToken.cUSD]: CeloContract.StableToken, [StableToken.cREAL]: CeloContract.StableTokenBRL, + [StableToken.$USDC]: CeloContract.StableToken$USDC, } export type CFType = typeof ContractFactories diff --git a/packages/sdk/contractkit/src/wrappers/StableToken.test.ts b/packages/sdk/contractkit/src/wrappers/StableToken.test.ts index 6393503af..09e6038b8 100644 --- a/packages/sdk/contractkit/src/wrappers/StableToken.test.ts +++ b/packages/sdk/contractkit/src/wrappers/StableToken.test.ts @@ -30,6 +30,11 @@ testWithGanache('StableToken Wrapper', async (web3) => { name: 'Celo Brazilian Real', symbol: 'cREAL', }, + [StableToken.$USDC]: { + stableToken: StableToken.$USDC, + name: 'Circle USD Coin', + symbol: '$USDC', + }, } for (const stableTokenInfo of Object.values(stableTokenInfos)) { diff --git a/packages/sdk/governance/package.json b/packages/sdk/governance/package.json index 99b015dec..9d7cb7b83 100644 --- a/packages/sdk/governance/package.json +++ b/packages/sdk/governance/package.json @@ -21,7 +21,7 @@ "prepublishOnly": "yarn build" }, "dependencies": { - "@celo/abis": "10.0.0", + "@celo/abis": "canary", "@celo/base": "^6.0.0", "@celo/connect": "^5.1.1", "@celo/contractkit": "^6.0.1-beta.0", diff --git a/packages/sdk/wallets/wallet-base/src/signing-utils.test.ts b/packages/sdk/wallets/wallet-base/src/signing-utils.test.ts index 679eb0bd5..20e32010c 100644 --- a/packages/sdk/wallets/wallet-base/src/signing-utils.test.ts +++ b/packages/sdk/wallets/wallet-base/src/signing-utils.test.ts @@ -423,6 +423,7 @@ describe('recoverTransaction', () => { ] `) }) + // TODO: What is viem doing here? test('cip42 serialized by viem', async () => { const account = privateKeyToAccount(PRIVATE_KEY1) const signed = await account.signTransaction( diff --git a/yarn.lock b/yarn.lock index f917765d4..d7816df94 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1536,10 +1536,10 @@ __metadata: languageName: node linkType: hard -"@celo/abis@npm:10.0.0": - version: 10.0.0 - resolution: "@celo/abis@npm:10.0.0" - checksum: 963571a9ed7d749df2437305df05cac7ed32c4902c00345fc678964faad01a28e3bc67dc7b29132945dec4ee0d177920d803bdf62b8250767a02a263cdee0213 +"@celo/abis@npm:canary": + version: 11.0.0-canary.7 + resolution: "@celo/abis@npm:11.0.0-canary.7" + checksum: 2a7a5323fc54d06b594618d0a49eb0ec519b1c23d8d22d52cc0c5480e62c01e9b3f89046f785a7c876a48cbf89ef39d8f426f97413ad6036a902f17f9b7d7ad0 languageName: node linkType: hard @@ -1590,7 +1590,7 @@ __metadata: version: 0.0.0-use.local resolution: "@celo/celocli@workspace:packages/cli" dependencies: - "@celo/abis": "npm:10.0.0" + "@celo/abis": "npm:canary" "@celo/base": "npm:^6.0.0" "@celo/celo-devchain": "npm:^6.0.3" "@celo/connect": "npm:^5.1.1" @@ -1698,7 +1698,7 @@ __metadata: version: 0.0.0-use.local resolution: "@celo/contractkit@workspace:packages/sdk/contractkit" dependencies: - "@celo/abis": "npm:10.0.0" + "@celo/abis": "npm:canary" "@celo/base": "npm:^6.0.0" "@celo/celo-devchain": "npm:^6.0.3" "@celo/connect": "npm:^5.1.1" @@ -1786,7 +1786,7 @@ __metadata: version: 0.0.0-use.local resolution: "@celo/governance@workspace:packages/sdk/governance" dependencies: - "@celo/abis": "npm:10.0.0" + "@celo/abis": "npm:canary" "@celo/base": "npm:^6.0.0" "@celo/connect": "npm:^5.1.1" "@celo/contractkit": "npm:^6.0.1-beta.0"