98 lines
2.6 KiB
TypeScript
98 lines
2.6 KiB
TypeScript
import { derive, sign } from "xrpl-accountlib";
|
|
|
|
import state, { IAccount } from "../index";
|
|
|
|
function arrayBufferToHex(arrayBuffer?: ArrayBuffer | null) {
|
|
if (!arrayBuffer) {
|
|
return "";
|
|
}
|
|
if (
|
|
typeof arrayBuffer !== "object" ||
|
|
arrayBuffer === null ||
|
|
typeof arrayBuffer.byteLength !== "number"
|
|
) {
|
|
throw new TypeError("Expected input to be an ArrayBuffer");
|
|
}
|
|
|
|
var view = new Uint8Array(arrayBuffer);
|
|
var result = "";
|
|
var value;
|
|
|
|
for (var i = 0; i < view.length; i++) {
|
|
value = view[i].toString(16);
|
|
result += value.length === 1 ? "0" + value : value;
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
/* deployHook function turns the wasm binary into
|
|
* hex string, signs the transaction and deploys it to
|
|
* Hooks testnet.
|
|
*/
|
|
export const deployHook = async (account: IAccount & { name?: string }) => {
|
|
if (
|
|
!state.files ||
|
|
state.files.length === 0 ||
|
|
!state.files?.[state.active]?.compiledContent
|
|
) {
|
|
return;
|
|
}
|
|
|
|
if (!state.files?.[state.active]?.compiledContent) {
|
|
return;
|
|
}
|
|
if (!state.client) {
|
|
return;
|
|
}
|
|
if (typeof window !== "undefined") {
|
|
const tx = {
|
|
Account: account.address,
|
|
TransactionType: "SetHook",
|
|
CreateCode: arrayBufferToHex(
|
|
state.files?.[state.active]?.compiledContent
|
|
).toUpperCase(),
|
|
HookOn: "0000000000000000",
|
|
Sequence: account.sequence,
|
|
Fee: "1000",
|
|
};
|
|
const keypair = derive.familySeed(account.secret);
|
|
const { signedTransaction } = sign(tx, keypair);
|
|
const currentAccount = state.accounts.find(
|
|
(acc) => acc.address === account.address
|
|
);
|
|
if (currentAccount) {
|
|
currentAccount.isLoading = true;
|
|
}
|
|
try {
|
|
const submitRes = await state.client.send({
|
|
command: "submit",
|
|
tx_blob: signedTransaction,
|
|
});
|
|
if (submitRes.engine_result === "tesSUCCESS") {
|
|
state.deployLogs.push({
|
|
type: "success",
|
|
message: "Hook deployed successfully ✅",
|
|
});
|
|
state.deployLogs.push({
|
|
type: "success",
|
|
message: `[${submitRes.engine_result}] ${submitRes.engine_result_message} Validated ledger index: ${submitRes.validated_ledger_index}`,
|
|
});
|
|
} else {
|
|
state.deployLogs.push({
|
|
type: "error",
|
|
message: `[${submitRes.engine_result}] ${submitRes.engine_result_message}`,
|
|
});
|
|
}
|
|
} catch (err) {
|
|
console.log(err);
|
|
state.deployLogs.push({
|
|
type: "error",
|
|
message: "Error occured while deploying",
|
|
});
|
|
}
|
|
if (currentAccount) {
|
|
currentAccount.isLoading = false;
|
|
}
|
|
}
|
|
}; |