@infibridge/celo-sdk-base
Version:
EthersJS wrapper for Celo Blockchain. Based on https://github.com/celo-tools/celo-ethers-wrapper with small modifications.
94 lines • 7.82 kB
JavaScript
import { utils, Wallet } from 'ethers';
import { serializeCeloTransaction, } from './CeloTransactionsWrapper';
const logger = new utils.Logger('CeloEthersWallet');
const forwardErrors = [
utils.Logger.errors.INSUFFICIENT_FUNDS,
utils.Logger.errors.NONCE_EXPIRED,
utils.Logger.errors.REPLACEMENT_UNDERPRICED,
];
export class CeloEthersWallet extends Wallet {
/**
* Override to skip checkTransaction step which rejects Celo tx properties
* https://github.com/ethers-io/ethers.js/blob/master/packages/abstract-signer/src.ts/index.ts
*/
async populateTransaction(transaction) {
const tx = await utils.resolveProperties(transaction);
if (tx.to != null) {
tx.to = Promise.resolve(tx.to).then(to => this.resolveName(to));
}
if (tx.gasPrice == null) {
tx.gasPrice = this.getGasPrice();
}
if (tx.nonce == null) {
tx.nonce = this.getTransactionCount('pending');
}
if (tx.gasLimit == null) {
tx.gasLimit = this.estimateGas(tx).catch(error => {
if (forwardErrors.indexOf(error.code) >= 0) {
throw error;
}
return logger.throwError('cannot estimate gas; transaction may fail or may require manual gas limit', utils.Logger.errors.UNPREDICTABLE_GAS_LIMIT, {
error: error,
tx: tx,
});
});
}
if (tx.chainId == null) {
tx.chainId = this.getChainId();
}
else {
tx.chainId = Promise.all([
Promise.resolve(tx.chainId),
this.getChainId(),
]).then(results => {
if (results[1] !== 0 && results[0] !== results[1]) {
logger.throwArgumentError('chainId address mismatch', 'transaction', transaction);
}
return results[0];
});
}
return await utils.resolveProperties(tx);
}
/**
* Override to serialize transaction using custom serialize method
* https://github.com/ethers-io/ethers.js/blob/master/packages/wallet/src.ts/index.ts
*/
async signTransaction(transaction) {
const populatedTx = await this.populateTransaction(transaction);
const tx = await utils.resolveProperties(populatedTx);
if (tx.from != null) {
if (utils.getAddress(tx.from) !== this.address) {
logger.throwArgumentError('transaction from address mismatch', 'transaction.from', transaction.from);
}
delete tx.from;
}
const signature = this._signingKey().signDigest(utils.keccak256(serializeCeloTransaction(tx)));
const serialized = serializeCeloTransaction(tx, signature);
return serialized;
}
/**
* Override just for type fix
* https://github.com/ethers-io/ethers.js/blob/master/packages/wallet/src.ts/index.ts
*/
sendTransaction(transaction) {
return super.sendTransaction(transaction);
}
/**
* Override to skip checkTransaction step which rejects Celo tx properties
* https://github.com/ethers-io/ethers.js/blob/master/packages/abstract-signer/src.ts/index.ts
*/
async estimateGas(transaction) {
this._checkProvider('estimateGas');
const tx = await utils.resolveProperties(transaction);
return await this.provider.estimateGas(tx);
}
/**
* Override to support alternative gas currencies
*/
async getGasPrice(feeCurrencyAddress) {
this._checkProvider('getGasPrice');
// @ts-ignore
return await this.provider.getGasPrice(feeCurrencyAddress);
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2Vsb0V0aGVyc1dhbGxldC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9DZWxvRXRoZXJzV2FsbGV0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBd0IsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLFFBQVEsQ0FBQTtBQUM1RCxPQUFPLEVBRUgsd0JBQXdCLEdBQzNCLE1BQU0sMkJBQTJCLENBQUE7QUFFbEMsTUFBTSxNQUFNLEdBQUcsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUE7QUFFbkQsTUFBTSxhQUFhLEdBQUc7SUFDbEIsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsa0JBQWtCO0lBQ3RDLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLGFBQWE7SUFDakMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsdUJBQXVCO0NBQzlDLENBQUE7QUFFRCxNQUFNLE9BQU8sZ0JBQWlCLFNBQVEsTUFBTTtJQUN4Qzs7O09BR0c7SUFDSCxLQUFLLENBQUMsbUJBQW1CLENBQ3JCLFdBQXFEO1FBRXJELE1BQU0sRUFBRSxHQUFRLE1BQU0sS0FBSyxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxDQUFBO1FBRTFELElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxJQUFJLEVBQUU7WUFDZixFQUFFLENBQUMsRUFBRSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTtTQUNsRTtRQUNELElBQUksRUFBRSxDQUFDLFFBQVEsSUFBSSxJQUFJLEVBQUU7WUFDckIsRUFBRSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUE7U0FDbkM7UUFDRCxJQUFJLEVBQUUsQ0FBQyxLQUFLLElBQUks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