@firefly-exchange/library-sui
Version:
Sui library housing helper methods, classes to interact with Bluefin protocol(s) deployed on Sui
111 lines (110 loc) • 4.6 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.Faucet = void 0;
const DeploymentConfig_1 = require("../DeploymentConfig");
const constants_1 = require("../constants");
const library_1 = require("../library");
const Transaction_1 = require("./Transaction");
const types_1 = require("../types");
class Faucet {
/**
* Requests SUI token from faucet running on Sui Node
* @param address address of the account that will get the SUI tokens
* @param faucetURL (optional) url of sui faucet, by default reads from deployment config
* @returns false if not successful else response from faucet
*/
static async requestSUI(address, faucetURL) {
const url = faucetURL || DeploymentConfig_1.network.faucet;
try {
const data = await fetch(url, {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify({
FixedAmountRequest: {
recipient: address
}
})
});
return data;
}
catch (e) {
console.log("Error while requesting gas", e.message);
}
return false;
}
/**
* Requests SUI coins from faucet account
* @param address Account to be funded
* @param faucet Account having enough SUI tokens to fund the reciever
* @param SuiClient client to execute transaction
* @param amount amount to be funded (must be in normal decimals) default is 1
*/
static async requestSUIFromAccount(address, faucet, suiClient, amount = 1) {
const txb = new types_1.TransactionBlock();
const [coin] = txb.splitCoins(txb.gas, [txb.pure.u64((0, library_1.toBigNumberStr)(amount, 9))]);
txb.transferObjects([coin], txb.pure.address(address));
txb.setSenderIfNotSet(faucet.toSuiAddress());
const builtTxb = await txb.build({
client: suiClient
});
const signature = await faucet.signTransaction(builtTxb);
return suiClient.executeTransactionBlock({
transactionBlock: builtTxb,
signature: signature.signature
});
}
/**
* Requests USDC tokens from faucet
* @param address address of the USDC receiver
* @param onChain onChainCalls class instance. The signer must own the treasury cap
* @param amount The amount of USDC requested (must be in base form)
* @returns {status, error} of transaction
*/
static async requestUSDC(address, onChain, amount) {
const tx = await onChain.mintUSDC({
amount: (0, library_1.toBigNumberStr)(amount || 10000, constants_1.USDC_BASE_DECIMALS),
to: address,
gasBudget: 500000
});
const status = Transaction_1.Transaction.getStatus(tx);
const error = Transaction_1.Transaction.getError(tx);
return { status, error };
}
/**
* Requests margin in margin bank of the provided address
* @param address address of the margin receiver
* @param onChain onChainCalls class instance. The signer must own the treasury cap
* @param amount The amount of margin requested (must be in base form)
* @returns
*/
static async requestMargin(address, onChain, amount) {
const amt = Number(amount) || 10000;
const ownerAddress = await onChain.signer.toSuiAddress();
let coin = undefined;
// TODO figure out why `onChain.getUSDCCoins` calls returns no coin
// until then use while
while (coin == undefined) {
// get USDC balance of owner
const ownerBalance = await onChain.getUSDCBalance();
// mint coins for owner
if (amt > ownerBalance) {
await onChain.mintUSDC({
amount: (0, library_1.toBigNumberStr)(1000000000, constants_1.USDC_BASE_DECIMALS)
});
}
coin = await onChain.getUSDCoinHavingBalance({ amount: amt });
}
// transferring from owners usdc coin to receiver
const tx = (await onChain.depositToBank({
coinID: coin.coinObjectId,
amount: (0, library_1.toBigNumberStr)(amt, constants_1.USDC_BASE_DECIMALS),
accountAddress: address
}));
const status = Transaction_1.Transaction.getStatus(tx);
const error = Transaction_1.Transaction.getError(tx);
return { status, error };
}
}
exports.Faucet = Faucet;
;