send-crypto
Version:
A minimal JavaScript library / wallet for sending crypto assets
103 lines • 9.94 kB
JavaScript
import BigNumber from "bignumber.js";
import { Message } from "@glif/filecoin-message";
import Filecoin from "@glif/filecoin-wallet-provider";
import { Network as FilNetwork } from "@glif/filecoin-address";
import { newPromiEvent } from "../../lib/promiEvent";
import { sleep } from "../../lib/retry";
import { SingleKeyProvider } from "./provider";
export class FILHandler {
network;
decimals = 18;
sharedState;
constructor(privateKey, network, options = {}, sharedState) {
const filecoin = new Filecoin(SingleKeyProvider(Buffer.from(privateKey, "hex")), {
apiAddress: options && options.apiAddress,
token: options && options.token,
});
this.network =
network === "mainnet" ? FilNetwork.MAIN : FilNetwork.TEST;
sharedState.filecoin = filecoin;
this.sharedState = sharedState;
}
// Returns whether or not this can handle the asset
handlesAsset = (asset) => typeof asset === "string" &&
["FIL", "FILECOIN"].indexOf(asset.toUpperCase()) !== -1;
address = async (asset, _options = {}) => {
if (!this.handlesAsset(asset)) {
throw new Error(`Asset ${asset} not supported.`);
}
const accounts = await this.sharedState.filecoin.wallet.getAccounts(0, 1, this.network);
return accounts[0];
};
// Balance
getBalance = async (asset, options = {}) => new BigNumber(await this.sharedState.filecoin.getBalance((options && options.address) || (await this.address(asset))));
getBalanceInSats = async (asset, options = {}) => (await this.getBalance(asset, options)).multipliedBy(new BigNumber(10).exponentiatedBy(this.decimals));
// Transfer
send = (to, value, asset, options = {}) => this.sendSats(to, value.times(new BigNumber(10).exponentiatedBy(this.decimals)), asset, options);
sendSats = (to, valueIn, asset, options = {}) => {
const promiEvent = newPromiEvent();
(async () => {
const address = await this.address(asset);
const nonce = await this.sharedState.filecoin.getNonce(address);
let value = valueIn;
let message = new Message({
to,
from: address,
value: valueIn,
method: 0,
gasFeeCap: 0,
gasLimit: 0,
gasPremium: 0,
nonce,
params: undefined,
...options,
});
message = await this.sharedState.filecoin.gasEstimateMessageGas(message.toLotusType());
if (options.subtractFee) {
const { maxFee: fee } = await this.sharedState.filecoin.gasEstimateMaxFee(message.toLotusType());
if (fee.gt(value)) {
throw new Error(`Unable to include fee in value, fee exceeds value (${fee.toFixed()} > ${value.toFixed()})`);
}
value = value.minus(fee);
}
const signed = await this.sharedState.filecoin.wallet.sign(address, message.toLotusType());
const tx = await this.sharedState.filecoin.sendMessage(signed.Message, signed.Signature.Data);
const txHash = tx["/"];
promiEvent.emit("transactionHash", txHash);
while (true) {
const result = await this.sharedState.filecoin.jsonRpcEngine.request("StateSearchMsg", tx);
/*
{
Message: {
'/': 'bafy2bzacedtcalpfb5dj3de6jb5lfncqtxw4kia4xotpg3on3p7gcesiwlube'
},
Receipt: { ExitCode: 0, Return: null, GasUsed: 433268 },
ReturnDec: null,
TipSet: [
{
'/': 'bafy2bzacedsqymqnjl2oir7q2rgbwyqscihvebkvr7hfzdq5b2tvcct3cwczy'
},
{
'/': 'bafy2bzacednrjqbsyooob3f76wwct4iupauehvq6wnzrbf6uc4dskptwu4er6'
},
{
'/': 'bafy2bzaceany2in5cadbyf27mecnmzc6ustqfewd5dobxquidzbn3wtnjd52y'
}
],
Height: 53025
}
*/
if (result) {
promiEvent.emit("confirmation", 1);
break;
}
await sleep(10 * 1000);
}
promiEvent.resolve(txHash);
})().catch((error) => {
promiEvent.reject(error);
});
return promiEvent;
};
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRklMSGFuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9oYW5kbGVycy9GSUwvRklMSGFuZGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLFNBQVMsTUFBTSxjQUFjLENBQUM7QUFDckMsT0FBTyxFQUFFLE9BQU8sRUFBYyxNQUFNLHdCQUF3QixDQUFDO0FBQzdELE9BQU8sUUFBUSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3RELE9BQU8sRUFBRSxPQUFPLElBQUksVUFBVSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFL0QsT0FBTyxFQUFFLGFBQWEsRUFBYyxNQUFNLHNCQUFzQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUV4QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFjL0MsTUFBTSxPQUFPLFVBQVU7SUFJRixPQUFPLENBQWE7SUFFcEIsUUFBUSxHQUFHLEVBQUUsQ0FBQztJQUVkLFdBQVcsQ0FFMUI7SUFFRixZQUNJLFVBQWtCLEVBQ2xCLE9BQWUsRUFDZixVQUE4QixFQUFFLEVBQ2hDLFdBQWlCO1FBRWpCLE1BQU0sUUFBUSxHQUFHLElBQUksUUFBUSxDQUN6QixpQkFBaUIsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUNqRDtZQUNJLFVBQVUsRUFBRSxPQUFPLElBQUksT0FBTyxDQUFDLFVBQVU7WUFDekMsS0FBSyxFQUFFLE9BQU8sSUFBSSxPQUFPLENBQUMsS0FBSztTQUNsQyxDQUNKLENBQUM7UUFFRixJQUFJLENBQUMsT0FBTztZQUNSLE9BQU8sS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUM7UUFFOUQsV0FBVyxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFDaEMsSUFB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