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;
 | 
						|
    }
 | 
						|
  }
 | 
						|
}; |