80d684c1e5
* fix: all wallet flows to use only ethers libraries * feat: remove ethereumjs-wallet * fix: remove the buggy `/wallet` bee call and use provider
106 lines
2.8 KiB
TypeScript
106 lines
2.8 KiB
TypeScript
import { debounce } from '@material-ui/core'
|
|
import { Contract, providers, Wallet } from 'ethers'
|
|
import { bzzContractInterface } from './bzz-contract-interface'
|
|
|
|
async function eth_getBalance(address: string, provider: providers.JsonRpcProvider): Promise<string> {
|
|
if (!address.startsWith('0x')) {
|
|
address = `0x${address}`
|
|
}
|
|
const balance = await provider.getBalance(address)
|
|
|
|
return balance.toString()
|
|
}
|
|
|
|
async function eth_getBlockByNumber(provider: providers.JsonRpcProvider): Promise<string> {
|
|
const blockNumber = await provider.getBlockNumber()
|
|
|
|
return blockNumber.toString()
|
|
}
|
|
|
|
const partialERC20tokenABI = [
|
|
{
|
|
constant: true,
|
|
inputs: [
|
|
{
|
|
name: '_owner',
|
|
type: 'address',
|
|
},
|
|
],
|
|
name: 'balanceOf',
|
|
outputs: [
|
|
{
|
|
name: 'balance',
|
|
type: 'uint256',
|
|
},
|
|
],
|
|
payable: false,
|
|
type: 'function',
|
|
},
|
|
]
|
|
|
|
async function eth_getBalanceERC20(
|
|
address: string,
|
|
provider: providers.JsonRpcProvider,
|
|
tokenAddress = '0xdbf3ea6f5bee45c02255b2c26a16f300502f68da',
|
|
): Promise<string> {
|
|
if (!address.startsWith('0x')) {
|
|
address = `0x${address}`
|
|
}
|
|
const contract = new Contract(tokenAddress, partialERC20tokenABI, provider)
|
|
const balance = await contract.balanceOf(address)
|
|
|
|
return balance.toString()
|
|
}
|
|
|
|
interface TransferResponse {
|
|
transaction: providers.TransactionResponse
|
|
receipt: providers.TransactionReceipt
|
|
}
|
|
|
|
export async function sendNativeTransaction(
|
|
privateKey: string,
|
|
to: string,
|
|
value: string,
|
|
jsonRpcProvider: string,
|
|
): Promise<TransferResponse> {
|
|
const signer = await makeReadySigner(privateKey, jsonRpcProvider)
|
|
const gasPrice = await signer.getGasPrice()
|
|
const transaction = await signer.sendTransaction({ to, value, gasPrice })
|
|
const receipt = await transaction.wait(1)
|
|
|
|
return { transaction, receipt }
|
|
}
|
|
|
|
export async function sendBzzTransaction(
|
|
privateKey: string,
|
|
to: string,
|
|
value: string,
|
|
jsonRpcProvider: string,
|
|
): Promise<TransferResponse> {
|
|
const signer = await makeReadySigner(privateKey, jsonRpcProvider)
|
|
const gasPrice = await signer.getGasPrice()
|
|
const bzz = new Contract('0xdBF3Ea6F5beE45c02255B2c26a16F300502F68da', bzzContractInterface, signer)
|
|
const transaction = await bzz.transfer(to, value, { gasPrice })
|
|
const receipt = await transaction.wait(1)
|
|
|
|
return { transaction, receipt }
|
|
}
|
|
|
|
async function makeReadySigner(privateKey: string, jsonRpcProvider: string) {
|
|
const provider = new providers.JsonRpcProvider(jsonRpcProvider, 100)
|
|
await provider.ready
|
|
const signer = new Wallet(privateKey, provider)
|
|
|
|
return signer
|
|
}
|
|
|
|
export const Rpc = {
|
|
sendNativeTransaction,
|
|
sendBzzTransaction,
|
|
_eth_getBalance: eth_getBalance,
|
|
_eth_getBalanceERC20: eth_getBalanceERC20,
|
|
eth_getBalance: debounce(eth_getBalance, 1_000),
|
|
eth_getBalanceERC20: debounce(eth_getBalanceERC20, 1_000),
|
|
eth_getBlockByNumber,
|
|
}
|