UNPKG

@algonameservice/sdk

Version:

JavaScript SDK to resolve ANS .algo names

304 lines (243 loc) 7.4 kB
import algosdk, { Transaction } from "algosdk"; import { REGISTRATION_PRICE, TRANSFER_FEE } from "./constants.js"; import CachedApi from "./cachedApi.js"; import { toIntArray } from "./util.js"; import { RegistrationTxns } from "./interfaces.js"; import { Record } from "./interfaces.js"; import { Name } from "./name.js"; export class Transactions extends CachedApi { private name: string; constructor( client: algosdk.Algodv2, indexer: algosdk.Indexer, name: Name | string, network?: string, app?: number ) { super(client, indexer, network, app); if (name instanceof Name) { this.name = name.name; } else { this.name = name; } } calculatePrice(period: number): number { const amounts: { [len: number]: number } = { 3: REGISTRATION_PRICE.CHAR_3_AMOUNT, 4: REGISTRATION_PRICE.CHAR_4_AMOUNT, 5: REGISTRATION_PRICE.CHAR_5_AMOUNT, }; const len = this.name.length >= 5 ? 5 : this.name.length; return amounts[len] * period; } async prepareNameRegistrationTransactions( address: string, period: number ): Promise<RegistrationTxns> { const algodClient = this.rpc; /* 1st Txn - Payment to Smart Contract */ let amount = 0; const lsig = await this.getTeal(this.name); const params = await algodClient.getTransactionParams().do(); params.fee = 1000; params.flatFee = true; let receiver = algosdk.getApplicationAddress(this.APP); let sender = address; if (period === undefined) { period = 1; } amount = this.calculatePrice(period); const closeToRemaninder = undefined; const note = undefined; const txn1 = algosdk.makePaymentTxnWithSuggestedParams( sender, receiver, amount, closeToRemaninder, note, params ); const groupTxns = []; groupTxns.push(txn1); /* 2nd Txn - Funding Lsig */ sender = address; receiver = lsig.address(); amount = 915000; const txn2 = algosdk.makePaymentTxnWithSuggestedParams( sender, receiver, amount, closeToRemaninder, note, params ); groupTxns.push(txn2); /* 3rd Txn - Optin to App from Lsig */ const txn3 = await algosdk.makeApplicationOptInTxnFromObject({ from: lsig.address(), suggestedParams: params, appIndex: this.APP, }); groupTxns.push(txn3); /* 4th Txn - Account registers name */ const method = "register_name"; const appArgs = []; appArgs.push(toIntArray(method)); appArgs.push(toIntArray(this.name)); appArgs.push(algosdk.encodeUint64(period)); const txn4 = await algosdk.makeApplicationNoOpTxn( address, params, this.APP, appArgs, [lsig.address()] ); groupTxns.push(txn4); algosdk.assignGroupID(groupTxns); const signedOptinTxn = algosdk.signLogicSigTransaction(groupTxns[2], lsig); return { optinTxn: signedOptinTxn, txns: groupTxns, unsignedOptinTxn: groupTxns[2], }; } async prepareUpdateNamePropertyTransactions( address: string, editedHandles: Record ): Promise<Transaction[]> { const lsig = await this.getTeal(this.name); const params = await this.rpc.getTransactionParams().do(); params.fee = 1000; params.flatFee = true; const method = "update_name"; const groupTxns = []; for (const key in editedHandles) { const appArgs = []; const network = key; const handle: string = editedHandles[key as keyof Record]; appArgs.push(toIntArray(method)); appArgs.push(toIntArray(network as string)); appArgs.push(toIntArray(handle as string)); const txn = await algosdk.makeApplicationNoOpTxn( address, params, this.APP, appArgs, [lsig.address()] ); groupTxns.push(txn); } if (Object.keys(editedHandles).length > 1) { algosdk.assignGroupID(groupTxns); } return groupTxns; } async prepareNameRenewalTxns( sender: string, years: number ): Promise<Transaction[]> { const params = await this.rpc.getTransactionParams().do(); const receiver = algosdk.getApplicationAddress(this.APP); const closeToRemaninder = undefined; const note = undefined; const paymentTxn = algosdk.makePaymentTxnWithSuggestedParams( sender, receiver, this.calculatePrice(years), closeToRemaninder, note, params ); const lsig = await this.getTeal(this.name); const appArgs = []; appArgs.push(toIntArray("renew_name")); appArgs.push(algosdk.encodeUint64(years)); const applicationTxn = algosdk.makeApplicationNoOpTxn( sender, params, this.APP, appArgs, [lsig.address()] ); algosdk.assignGroupID([paymentTxn, applicationTxn]); return [paymentTxn, applicationTxn]; } async prepareUpdateValueTxn(address: string, value: string) { const params = await this.rpc.getTransactionParams().do(); const lsig = await this.getTeal(this.name); const appArgs = []; appArgs.push(toIntArray("set_default_account")); return algosdk.makeApplicationNoOpTxn(address, params, this.APP, appArgs, [ lsig.address(), value, ]); } async prepareSetDefaultDomainTxn(address: string) { const params = await this.rpc.getTransactionParams().do(); const lsig = await this.getTeal(this.name); const appArgs = []; appArgs.push(toIntArray("set_default_account")); return algosdk.makeApplicationNoOpTxn(address, params, this.APP, appArgs, [ lsig.address(), ]); } async prepareInitiateNameTransferTransaction( sender: string, newOwner: string, price: number ): Promise<Transaction> { price = algosdk.algosToMicroalgos(price); const params = await this.rpc.getTransactionParams().do(); const lsig = await this.getTeal(this.name); const appArgs = []; appArgs.push(toIntArray("initiate_transfer")); appArgs.push(algosdk.encodeUint64(price)); return algosdk.makeApplicationNoOpTxn(sender, params, this.APP, appArgs, [ lsig.address(), newOwner, ]); } async prepareAcceptNameTransferTransactions( sender: string, receiver: string, amt: number ): Promise<Transaction[]> { amt = algosdk.algosToMicroalgos(amt); const params = await this.rpc.getTransactionParams().do(); const closeToRemaninder = undefined; const note = undefined; const paymentToOwnerTxn = algosdk.makePaymentTxnWithSuggestedParams( sender, receiver, amt, closeToRemaninder, note, params ); receiver = algosdk.getApplicationAddress(this.APP); const paymentToSmartContractTxn = algosdk.makePaymentTxnWithSuggestedParams( sender, receiver, TRANSFER_FEE, closeToRemaninder, note, params ); const lsig = await this.getTeal(this.name); const appArgs = []; appArgs.push(toIntArray("accept_transfer")); const applicationTxn = algosdk.makeApplicationNoOpTxn( sender, params, this.APP, appArgs, [lsig.address()] ); algosdk.assignGroupID([ paymentToOwnerTxn, paymentToSmartContractTxn, applicationTxn, ]); return [paymentToOwnerTxn, paymentToSmartContractTxn, applicationTxn]; } }