UNPKG

@algonameservice/sdk

Version:

JavaScript SDK to resolve ANS .algo names

1 lines 56.3 kB
{"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/validation.ts","../src/constants.ts","../src/resolver.ts","../src/cachedApi.ts","../src/util.ts","../src/transactions.ts","../src/name.ts","../src/address.ts"],"sourcesContent":["import { AddressValidationError } from \"./errors.js\";\nimport { isValidAddress, normalizeName } from \"./validation.js\";\nimport { Name } from \"./name.js\";\nimport { Address } from \"./address.js\";\nimport CachedApi from \"./cachedApi.js\";\nimport algosdk from \"algosdk\";\n\nexport { Resolver } from \"./resolver.js\";\nexport { Transactions } from \"./transactions.js\";\nexport * from \"./errors.js\";\n\nexport class ANS extends CachedApi {\n protected network = \"mainnet\";\n\n constructor(\n client: algosdk.Algodv2,\n indexer: algosdk.Indexer,\n network?: string,\n appId?: number\n ) {\n super(client, indexer, network, appId);\n if (network === \"testnet\") {\n this.network = \"testnet\";\n }\n }\n\n name(name: string): Name {\n name = normalizeName(name);\n return new Name({\n rpc: this.rpc,\n indexer: this.indexer,\n name,\n network: this.network,\n app: this.APP\n });\n }\n\n address(address: string): Address {\n if (!isValidAddress(address)) {\n throw new AddressValidationError();\n }\n return new Address({\n rpc: this.rpc,\n indexer: this.indexer,\n address,\n network: this.network,\n app: this.APP\n });\n }\n}\n","export class AddressValidationError extends Error {\n name: string;\n type: string;\n constructor() {\n super(`This is not a valid Algorand address`);\n this.name = \"InvalidAddressError\";\n this.type = \"InvalidAddressError\";\n }\n}\n\nexport class InvalidNameError extends Error {\n name: string;\n type: string;\n constructor() {\n super(\n `The name must be between 3 and 64 characters and must only contain a-z and 0-9 characters`\n );\n this.name = \"InvalidNameError\";\n this.type = \"InvalidNameError\";\n }\n}\n\nexport class NameNotRegisteredError extends Error {\n name: string;\n type: string;\n constructor(name: string) {\n super(`Name ${name}.algo is not registered`);\n this.name = \"NameNotRegisteredError\";\n this.type = \"NameNotRegisteredError\";\n }\n}\n\nexport class IncorrectOwnerError extends Error {\n name: string;\n type: string;\n constructor(name: string, address: string) {\n super(`Name ${name}.algo is not owned by ${address}`);\n this.name = \"IncorrectOwnerError\";\n this.type = \"IncorrectOwnerError\";\n }\n}\n\nexport class PropertyNotSetError extends Error {\n name: string;\n type: string;\n constructor(property: string) {\n super(`Property ${property} is not set`);\n this.name = \"PropertyNotSetError\";\n this.type = \"PropertyNotSetError\";\n }\n}\n","import algosdk from \"algosdk\";\nimport { ALLOWED_TLDS, ASCII_CODES } from \"./constants.js\";\nimport { InvalidNameError } from \"./errors.js\";\n\nexport function isValidAddress(address: string): boolean {\n return algosdk.isValidAddress(address);\n}\n\nexport function normalizeName(name: string): string {\n const tld: string = name.split(\".\").pop() as string;\n if (!ALLOWED_TLDS.includes(tld)) {\n throw new Error(\"TLD not supported\");\n }\n name = name.split(\".\")[0].toLowerCase();\n const lengthOfName = name.length;\n if (lengthOfName > 64) {\n throw new InvalidNameError();\n }\n for (let i = 0; i < lengthOfName; i++) {\n if (\n !(\n name.charCodeAt(i) >= ASCII_CODES.ASCII_0 &&\n name.charCodeAt(i) <= ASCII_CODES.ASCII_9\n )\n ) {\n if (\n !(\n name.charCodeAt(i) >= ASCII_CODES.ASCII_A &&\n name.charCodeAt(i) <= ASCII_CODES.ASCII_Z\n )\n )\n throw new InvalidNameError();\n }\n }\n return name;\n}\n","export const APP_ID = 628095415;\nexport const TESTNET_APP_ID = 75101786;\n\nexport const REGISTRATION_PRICE = {\n CHAR_3_AMOUNT: 150000000,\n CHAR_4_AMOUNT: 50000000,\n CHAR_5_AMOUNT: 5000000,\n};\n\nexport const TRANSFER_FEE = 2000000;\n\nexport const IPFS_LINK = \"https://ipfs.infura.io/ipfs/\";\n\nexport const ASCII_CODES = {\n ASCII_A: 97,\n ASCII_Z: 122,\n ASCII_0: 48,\n ASCII_9: 57,\n};\n\nexport const ALLOWED_SOCIALS = [\n \"github\",\n \"twitter\",\n \"telegram\",\n \"youtube\",\n \"reddit\",\n \"discord\",\n];\n\nexport const TESTNET_ESCROW =\n \"ACFFHRILZQ6W2UDNYYTHV55YS6MZWJR4PEDVBFAL575FFK4AT4UBCO3SXE\";\nexport const MAINNET_ESCROW =\n \"SYGCDTWGBXKV4ZL5YAWSYAVOUC25U2XDB6SMQHLRCTYVF566TQZ3EOABH4\";\n\nexport const ALLOWED_TLDS = [\"algo\"];\n","import algosdk, { Transaction } from \"algosdk\";\nimport { ALLOWED_SOCIALS } from \"./constants.js\";\nimport {\n AddressValidationError,\n NameNotRegisteredError,\n PropertyNotSetError,\n} from \"./errors.js\";\nimport CachedApi from \"./cachedApi.js\";\nimport { Domain, NameResponse, Record } from \"./interfaces.js\";\nimport { b64toString } from \"./util.js\";\nimport { Name } from \"./name.js\";\n\ndeclare const Buffer: any;\n\nexport class Resolver extends CachedApi {\n private name?: Name;\n // @ts-ignore\n private resolvedData?: Record<string, any>;\n\n constructor(\n client: algosdk.Algodv2,\n indexer: algosdk.Indexer,\n name?: Name,\n network?: string,\n app?: number\n ) {\n super(client, indexer, network, app);\n this.name = name;\n }\n\n private checkName(name?: string): string {\n if (!name) {\n // @ts-ignore\n name = this?.name.name;\n }\n if (!name) {\n throw new Error(\"A name must be provided\");\n }\n return name;\n }\n\n async resolveName(name?: string): Promise<NameResponse> {\n name = this.checkName(name);\n let found = false;\n const error: NameResponse = {\n found: false,\n socials: [],\n metadata: [],\n address: \"Not Registered\",\n value: \"Not Registered\",\n };\n\n try {\n if (!this.resolvedData || name !== this.name?.name) {\n this.resolvedData = await this.indexer\n .lookupAccountByID((await this.getTeal(name as string)).address())\n .do();\n }\n\n let accountInfo = this.resolvedData;\n\n accountInfo = accountInfo.account[\"apps-local-state\"];\n const length = accountInfo.length;\n let address, value: any;\n\n let socials: Record[] = [],\n metadata: Record[] = [];\n\n for (let i = 0; i < length; i++) {\n const app = accountInfo[i];\n if (app.id === this.APP) {\n const kv = app[\"key-value\"];\n const decodedKvPairs = this.decodeKvPairs(kv);\n socials = this.filterKvPairs(decodedKvPairs, \"socials\");\n metadata = this.filterKvPairs(decodedKvPairs, \"metadata\");\n found = true;\n address = metadata.filter((kv: Record) => kv.key === \"owner\")[0]\n .value;\n value = metadata.filter(\n (kv: Record) => kv.key === \"account\" || kv.key === \"value\"\n );\n if (value.length > 0) {\n value = value[0].value;\n } else {\n value = address;\n }\n }\n }\n\n if (found) {\n return {\n found,\n address,\n socials,\n metadata,\n value,\n };\n }\n\n return error;\n } catch (err) {\n return error;\n }\n }\n\n async getNamesOwnedByAddress(\n address: string,\n socials = false,\n metadata = false,\n limit = 10\n ): Promise<Domain[]> {\n if (!(await algosdk.isValidAddress(address))) {\n throw new AddressValidationError();\n }\n\n let nextToken = \"\";\n let txnLength = 1;\n let txns = [];\n\n while (txnLength > 0) {\n try {\n const info = await this.indexer\n .searchForTransactions()\n .address(address)\n .addressRole(\"sender\")\n .afterTime(\"2022-02-24\")\n .txType(\"appl\")\n .applicationID(this.APP)\n .nextToken(nextToken)\n .do();\n\n txnLength = info.transactions.length;\n\n if (txnLength > 0) {\n nextToken = info[\"next-token\"];\n txns.push(info.transactions);\n }\n } catch (err) {\n return [];\n }\n }\n\n let accountTxns: algosdk.Transaction[] = [];\n for (let i = 0; i < txns.length; i++) {\n accountTxns = accountTxns.concat(txns[i]);\n }\n\n txns = accountTxns;\n const names: string[] = await this.filterDomainRegistrationTxns(txns);\n\n if (names.length > 0) {\n const details = [];\n\n for (let i = 0; i < names.length; i++) {\n if (details.length && details.length >= limit) {\n break;\n }\n const info: NameResponse = await this.resolveName(names[i]);\n if (!info.found) {\n i--;\n continue;\n }\n if (info.found && info.address === address) {\n const domain: Domain = {\n address: \"\",\n found: true,\n name: \"\",\n };\n domain.name = names[i] + \".algo\";\n domain.address = info.address;\n if (socials) {\n domain.socials = info.socials;\n }\n if (metadata) {\n domain.metadata = info.metadata;\n }\n details.push(domain);\n }\n }\n return details;\n }\n\n return [];\n }\n\n filterKvPairs(kvPairs: Record[], type: string): Record[] {\n const socials: Record[] = [],\n metadata: Record[] = [];\n\n for (const i in kvPairs) {\n const { key, value } = kvPairs[i];\n\n const kvObj = {\n key,\n value,\n };\n\n if (ALLOWED_SOCIALS.includes(key)) {\n socials.push(kvObj);\n continue;\n }\n metadata.push(kvObj);\n }\n if (type === \"socials\") {\n return socials;\n }\n if (type === \"metadata\") {\n return metadata;\n }\n\n return [];\n }\n\n decodeKvPairs(kvPairs: Record[]): Record[] {\n return kvPairs.map((kvPair) => {\n const decodedKvPair: Record = {\n key: \"\",\n value: \"\",\n };\n\n let { key } = kvPair;\n const { value } = kvPair;\n\n key = Buffer.from(key, \"base64\").toString();\n decodedKvPair.key = key;\n\n if (\n key === \"owner\" ||\n key === \"transfer_to\" ||\n key === \"account\" ||\n key === \"value\"\n ) {\n decodedKvPair.value = algosdk.encodeAddress(\n // @ts-ignore\n new Uint8Array(Buffer.from(value.bytes, \"base64\"))\n );\n return decodedKvPair;\n }\n\n // @ts-ignore\n if (value.type === 1) {\n // @ts-ignore\n decodedKvPair.value = Buffer.from(value.bytes, \"base64\").toString();\n }\n\n // @ts-ignore\n if (value.type === 2) {\n // @ts-ignore\n decodedKvPair.value = value.uint;\n }\n\n return decodedKvPair;\n });\n }\n\n async filterDomainRegistrationTxns(txns: Transaction[]): Promise<string[]> {\n const names: string[] = [];\n try {\n for (let i = 0; i < txns.length; i++) {\n const txn: Transaction = txns[i];\n if (txn[\"tx-type\" as keyof Transaction] === \"appl\") {\n // @ts-ignore\n if (txn[\"application-transaction\"][\"application-id\"] === this.APP) {\n // @ts-ignore\n const appArgs = txn[\"application-transaction\"][\"application-args\"];\n\n if (\n Buffer.from(appArgs[0], \"base64\").toString() === \"register_name\"\n ) {\n const decodedName = b64toString(appArgs[1]);\n if (!names.includes(decodedName)) {\n names.push(decodedName);\n }\n } else if (b64toString(appArgs[0]) === \"accept_transfer\") {\n // @ts-ignore\n const lsigAccount = txn[\"application-transaction\"][\"accounts\"][0];\n let accountInfo = await this.indexer\n .lookupAccountByID(lsigAccount)\n .do();\n accountInfo = accountInfo.account[\"apps-local-state\"];\n\n const length = accountInfo.length;\n\n for (let i = 0; i < length; i++) {\n if (accountInfo[i].id === this.APP) {\n const kvPairs = accountInfo[i][\"key-value\"];\n const domainInfo = this.decodeKvPairs(kvPairs).filter(\n (domain: Record) => domain.key === \"name\"\n );\n if (!names.includes(domainInfo[0].value)) {\n names.push(domainInfo[0].value);\n }\n }\n }\n }\n }\n }\n }\n } catch (err) {\n return [];\n }\n\n return names;\n }\n\n async getDefaultDomain(address: string): Promise<string | Error> {\n let nextToken = \"\";\n let txnLength = 1;\n let txns = [];\n\n while (txnLength > 0) {\n try {\n const info = await this.indexer\n .searchForTransactions()\n .address(address)\n .addressRole(\"sender\")\n .afterTime(\"2022-02-24\")\n .txType(\"appl\")\n .applicationID(this.APP)\n .nextToken(nextToken)\n .do();\n\n txnLength = info.transactions.length;\n\n if (txnLength > 0) {\n nextToken = info[\"next-token\"];\n txns.push(info.transactions);\n }\n } catch (err) {\n throw Error(\"No transactions found\");\n }\n }\n\n let accountTxns: algosdk.Transaction[] = [];\n for (let i = 0; i < txns.length; i++) {\n accountTxns = accountTxns.concat(txns[i]);\n }\n\n txns = accountTxns;\n const appArgs = txns.map(\n (txn: any) => txn[\"application-transaction\"][\"application-args\"][0]\n );\n const appAccounts = txns.map(\n (txn: any) => txn[\"application-transaction\"][\"accounts\"]\n );\n for (const i in appArgs) {\n if (\n Buffer.from(appArgs[i], \"base64\").toString() === \"set_default_account\"\n ) {\n const account = appAccounts[i];\n let accountInfo = await this.indexer.lookupAccountByID(account).do();\n accountInfo = accountInfo[\"account\"][\"apps-local-state\"];\n for (const i in accountInfo) {\n if (accountInfo[i].id === this.APP) {\n const domain = this.decodeKvPairs(\n accountInfo[i][\"key-value\"]\n ).filter((kv: any) => kv.key === \"name\");\n if (domain.length > 0) {\n return domain[0].value + \".algo\";\n } else {\n throw Error(\"Default domain not set\");\n }\n }\n }\n }\n }\n const domains = await this.getNamesOwnedByAddress(address, false, false, 1);\n if (domains.length > 0) {\n return domains[0].name;\n }\n throw Error(\"No domains owned by this address\");\n }\n\n async owner(): Promise<string> {\n const domainInformation: NameResponse = await this.resolveName();\n if (domainInformation.found) {\n // @ts-ignore\n return domainInformation.address;\n }\n\n // @ts-ignore\n throw new NameNotRegisteredError(this.name.name);\n }\n\n async value(): Promise<string> {\n const domainInformation: NameResponse = await this.resolveName();\n if (domainInformation.found) {\n // @ts-ignore\n return domainInformation.value;\n }\n\n // @ts-ignore\n throw new NameNotRegisteredError(this.name.name);\n }\n\n async text(key: string): Promise<string> {\n const domainInformation: NameResponse = await this.resolveName();\n if (domainInformation.found) {\n const socialRecords: Record[] | undefined =\n domainInformation.socials?.filter(\n (social: Record) => social.key === key\n );\n if (socialRecords && socialRecords.length > 0) {\n return socialRecords[0].value;\n }\n const metadataRecords = domainInformation.metadata?.filter(\n (metadata: Record) => metadata.key === key\n );\n if (metadataRecords && metadataRecords.length > 0) {\n return metadataRecords[0].value;\n }\n\n throw new PropertyNotSetError(key);\n }\n\n // @ts-ignore\n throw new NameNotRegisteredError(this.name.name);\n }\n\n async expiry(): Promise<Date> {\n const domainInformation: NameResponse = await this.resolveName();\n if (domainInformation.found) {\n //Convert milliseconds to seconds by multiplying with 1000\n return new Date(\n parseInt(\n domainInformation?.metadata!.filter(\n (data: Record) => data.key === \"expiry\"\n )[0].value\n ) * 1000\n );\n }\n\n // @ts-ignore\n throw new NameNotRegisteredError(this.name.name);\n }\n\n async content(): Promise<string> {\n const domainInformation = await this.resolveName();\n if (domainInformation.found) {\n const contentRecords: Record[] = domainInformation?.metadata!.filter(\n (kv: Record) => kv.key === \"content\"\n );\n if (contentRecords.length > 0) {\n return contentRecords[0].value;\n }\n return \"Content field is not set\";\n }\n\n // @ts-ignore\n throw new NameNotRegisteredError(this._name);\n }\n}\n","import algosdk, { LogicSigAccount } from \"algosdk\";\nimport { generateTeal } from \"./util.js\";\nimport {\n MAINNET_ESCROW,\n APP_ID,\n TESTNET_ESCROW,\n TESTNET_APP_ID,\n} from \"./constants.js\";\n\nexport default class CachedApi {\n private cache: { [name: string]: algosdk.LogicSigAccount } = {};\n\n protected rpc: algosdk.Algodv2;\n protected indexer: algosdk.Indexer;\n protected ESCROW: string = MAINNET_ESCROW;\n protected APP: number = APP_ID;\n\n constructor(\n client: algosdk.Algodv2,\n indexer: algosdk.Indexer,\n network?: string,\n appId?: number\n ) {\n this.rpc = client;\n this.indexer = indexer;\n if (network === \"testnet\") {\n this.ESCROW = algosdk.getApplicationAddress(appId ?? TESTNET_APP_ID) ?? TESTNET_ESCROW;\n this.APP = appId ?? TESTNET_APP_ID;\n }\n }\n\n protected async getTeal(name: string): Promise<LogicSigAccount> {\n if (name in this.cache) {\n return this.cache[name];\n }\n\n let program = await this.rpc\n .compile(generateTeal(name as string, this.ESCROW, this.APP))\n .do();\n program = new Uint8Array(Buffer.from(program.result, \"base64\"));\n\n this.cache[name] = new algosdk.LogicSigAccount(program);\n return this.cache[name];\n }\n}\n","export function generateTeal(name: string, escrow?: string, app?: number) {\n return `#pragma version 4\n byte \"${name}\"\n len\n int 3\n ==\n bnz main_l22\n byte \"${name}\"\n len\n int 4\n ==\n bnz main_l13\n byte \"${name}\"\n len\n int 5\n >=\n bnz main_l4\n err\n main_l4:\n gtxn 0 Amount\n int 5000000\n >=\n assert\n byte \"${name}\"\n len\n int 64\n <=\n assert\n int 0\n store 0\n main_l5:\n load 0\n byte \"${name}\"\n len\n <\n bnz main_l12\n global GroupSize\n int 2\n ==\n global GroupSize\n int 4\n ==\n ||\n assert\n gtxn 0 Sender\n gtxn 1 Sender\n ==\n assert\n gtxn 0 Receiver\n addr ${escrow}\n ==\n assert\n global GroupSize\n int 2\n ==\n bnz main_l11\n global GroupSize\n int 4\n ==\n bnz main_l10\n int 0\n return\n main_l9:\n int 1\n assert\n int 1\n b main_l31\n main_l10:\n gtxn 1 Receiver\n gtxn 2 Sender\n ==\n gtxn 2 ApplicationID\n int ${app}\n ==\n &&\n gtxn 2 OnCompletion\n int OptIn\n ==\n &&\n gtxn 3 ApplicationID\n int ${app}\n ==\n &&\n gtxn 3 Sender\n gtxn 0 Sender\n ==\n &&\n gtxna 3 ApplicationArgs 0\n byte \"register_name\"\n ==\n &&\n gtxna 3 ApplicationArgs 1\n byte \"${name}\"\n ==\n &&\n assert\n b main_l9\n main_l11:\n gtxn 1 ApplicationID\n int ${app}\n ==\n gtxna 1 ApplicationArgs 0\n byte \"register_name\"\n ==\n &&\n gtxna 1 ApplicationArgs 1\n byte \"${name}\"\n ==\n &&\n assert\n b main_l9\n main_l12:\n byte \"${name}\"\n load 0\n getbyte\n int 97\n >=\n byte \"${name}\"\n load 0\n getbyte\n int 122\n <=\n &&\n byte \"${name}\"\n load 0\n getbyte\n int 48\n >=\n byte \"${name}\"\n load 0\n getbyte\n int 57\n <=\n &&\n ||\n assert\n load 0\n int 1\n +\n store 0\n b main_l5\n main_l13:\n gtxn 0 Amount\n int 50000000\n >=\n assert\n byte \"${name}\"\n len\n int 64\n <=\n assert\n int 0\n store 0\n main_l14:\n load 0\n byte \"${name}\"\n len\n <\n bnz main_l21\n global GroupSize\n int 2\n ==\n global GroupSize\n int 4\n ==\n ||\n assert\n gtxn 0 Sender\n gtxn 1 Sender\n ==\n assert\n gtxn 0 Receiver\n addr ${escrow}\n ==\n assert\n global GroupSize\n int 2\n ==\n bnz main_l20\n global GroupSize\n int 4\n ==\n bnz main_l19\n int 0\n return\n main_l18:\n int 1\n assert\n int 1\n b main_l31\n main_l19:\n gtxn 1 Receiver\n gtxn 2 Sender\n ==\n gtxn 2 ApplicationID\n int ${app}\n ==\n &&\n gtxn 2 OnCompletion\n int OptIn\n ==\n &&\n gtxn 3 ApplicationID\n int ${app}\n ==\n &&\n gtxn 3 Sender\n gtxn 0 Sender\n ==\n &&\n gtxna 3 ApplicationArgs 0\n byte \"register_name\"\n ==\n &&\n gtxna 3 ApplicationArgs 1\n byte \"${name}\"\n ==\n &&\n assert\n b main_l18\n main_l20:\n gtxn 1 ApplicationID\n int ${app}\n ==\n gtxna 1 ApplicationArgs 0\n byte \"register_name\"\n ==\n &&\n gtxna 1 ApplicationArgs 1\n byte \"${name}\"\n ==\n &&\n assert\n b main_l18\n main_l21:\n byte \"${name}\"\n load 0\n getbyte\n int 97\n >=\n byte \"${name}\"\n load 0\n getbyte\n int 122\n <=\n &&\n byte \"${name}\"\n load 0\n getbyte\n int 48\n >=\n byte \"${name}\"\n load 0\n getbyte\n int 57\n <=\n &&\n ||\n assert\n load 0\n int 1\n +\n store 0\n b main_l14\n main_l22:\n gtxn 0 Amount\n int 150000000\n >=\n assert\n byte \"${name}\"\n len\n int 64\n <=\n assert\n int 0\n store 0\n main_l23:\n load 0\n byte \"${name}\"\n len\n <\n bnz main_l30\n global GroupSize\n int 2\n ==\n global GroupSize\n int 4\n ==\n ||\n assert\n gtxn 0 Sender\n gtxn 1 Sender\n ==\n assert\n gtxn 0 Receiver\n addr ${escrow}\n ==\n assert\n global GroupSize\n int 2\n ==\n bnz main_l29\n global GroupSize\n int 4\n ==\n bnz main_l28\n int 0\n return\n main_l27:\n int 1\n assert\n int 1\n b main_l31\n main_l28:\n gtxn 1 Receiver\n gtxn 2 Sender\n ==\n gtxn 2 ApplicationID\n int ${app}\n ==\n &&\n gtxn 2 OnCompletion\n int OptIn\n ==\n &&\n gtxn 3 ApplicationID\n int ${app}\n ==\n &&\n gtxn 3 Sender\n gtxn 0 Sender\n ==\n &&\n gtxna 3 ApplicationArgs 0\n byte \"register_name\"\n ==\n &&\n gtxna 3 ApplicationArgs 1\n byte \"${name}\"\n ==\n &&\n assert\n b main_l27\n main_l29:\n gtxn 1 ApplicationID\n int ${app}\n ==\n gtxna 1 ApplicationArgs 0\n byte \"register_name\"\n ==\n &&\n gtxna 1 ApplicationArgs 1\n byte \"${name}\"\n ==\n &&\n assert\n b main_l27\n main_l30:\n byte \"${name}\"\n load 0\n getbyte\n int 97\n >=\n byte \"${name}\"\n load 0\n getbyte\n int 122\n <=\n &&\n byte \"${name}\"\n load 0\n getbyte\n int 48\n >=\n byte \"${name}\"\n load 0\n getbyte\n int 57\n <=\n &&\n ||\n assert\n load 0\n int 1\n +\n store 0\n b main_l23\n main_l31:\n return`;\n}\n\nexport function b64toString(data: string): string {\n return Buffer.from(data, \"base64\").toString();\n}\n\nexport function toIntArray(data: string): Uint8Array {\n return new Uint8Array(Buffer.from(data));\n}\n","import algosdk, { Transaction } from \"algosdk\";\nimport { REGISTRATION_PRICE, TRANSFER_FEE } from \"./constants.js\";\nimport CachedApi from \"./cachedApi.js\";\nimport { toIntArray } from \"./util.js\";\nimport { RegistrationTxns } from \"./interfaces.js\";\nimport { Record } from \"./interfaces.js\";\nimport { Name } from \"./name.js\";\n\nexport class Transactions extends CachedApi {\n private name: string;\n\n constructor(\n client: algosdk.Algodv2,\n indexer: algosdk.Indexer,\n name: Name | string,\n network?: string,\n app?: number\n ) {\n super(client, indexer, network, app);\n if (name instanceof Name) {\n this.name = name.name;\n } else {\n this.name = name;\n }\n }\n\n calculatePrice(period: number): number {\n const amounts: { [len: number]: number } = {\n 3: REGISTRATION_PRICE.CHAR_3_AMOUNT,\n 4: REGISTRATION_PRICE.CHAR_4_AMOUNT,\n 5: REGISTRATION_PRICE.CHAR_5_AMOUNT,\n };\n const len = this.name.length >= 5 ? 5 : this.name.length;\n\n return amounts[len] * period;\n }\n\n async prepareNameRegistrationTransactions(\n address: string,\n period: number\n ): Promise<RegistrationTxns> {\n const algodClient = this.rpc;\n /* 1st Txn - Payment to Smart Contract */\n let amount = 0;\n const lsig = await this.getTeal(this.name);\n const params = await algodClient.getTransactionParams().do();\n\n params.fee = 1000;\n params.flatFee = true;\n\n let receiver = algosdk.getApplicationAddress(this.APP);\n let sender = address;\n\n if (period === undefined) {\n period = 1;\n }\n\n amount = this.calculatePrice(period);\n\n const closeToRemaninder = undefined;\n const note = undefined;\n\n const txn1 = algosdk.makePaymentTxnWithSuggestedParams(\n sender,\n receiver,\n amount,\n closeToRemaninder,\n note,\n params\n );\n\n const groupTxns = [];\n groupTxns.push(txn1);\n\n /* 2nd Txn - Funding Lsig */\n\n sender = address;\n receiver = lsig.address();\n amount = 915000;\n\n const txn2 = algosdk.makePaymentTxnWithSuggestedParams(\n sender,\n receiver,\n amount,\n closeToRemaninder,\n note,\n params\n );\n\n groupTxns.push(txn2);\n\n /* 3rd Txn - Optin to App from Lsig */\n\n const txn3 = await algosdk.makeApplicationOptInTxnFromObject({\n from: lsig.address(),\n suggestedParams: params,\n appIndex: this.APP,\n });\n\n groupTxns.push(txn3);\n\n /* 4th Txn - Account registers name */\n\n const method = \"register_name\";\n\n const appArgs = [];\n\n appArgs.push(toIntArray(method));\n appArgs.push(toIntArray(this.name));\n appArgs.push(algosdk.encodeUint64(period));\n const txn4 = await algosdk.makeApplicationNoOpTxn(\n address,\n params,\n this.APP,\n appArgs,\n [lsig.address()]\n );\n groupTxns.push(txn4);\n\n algosdk.assignGroupID(groupTxns);\n\n const signedOptinTxn = algosdk.signLogicSigTransaction(groupTxns[2], lsig);\n\n return {\n optinTxn: signedOptinTxn,\n txns: groupTxns,\n unsignedOptinTxn: groupTxns[2],\n };\n }\n\n async prepareUpdateNamePropertyTransactions(\n address: string,\n editedHandles: Record\n ): Promise<Transaction[]> {\n const lsig = await this.getTeal(this.name);\n const params = await this.rpc.getTransactionParams().do();\n params.fee = 1000;\n params.flatFee = true;\n\n const method = \"update_name\";\n\n const groupTxns = [];\n\n for (const key in editedHandles) {\n const appArgs = [];\n const network = key;\n const handle: string = editedHandles[key as keyof Record];\n\n appArgs.push(toIntArray(method));\n appArgs.push(toIntArray(network as string));\n appArgs.push(toIntArray(handle as string));\n\n const txn = await algosdk.makeApplicationNoOpTxn(\n address,\n params,\n this.APP,\n appArgs,\n [lsig.address()]\n );\n groupTxns.push(txn);\n }\n\n if (Object.keys(editedHandles).length > 1) {\n algosdk.assignGroupID(groupTxns);\n }\n\n return groupTxns;\n }\n\n async prepareNameRenewalTxns(\n sender: string,\n years: number\n ): Promise<Transaction[]> {\n const params = await this.rpc.getTransactionParams().do();\n const receiver = algosdk.getApplicationAddress(this.APP);\n const closeToRemaninder = undefined;\n const note = undefined;\n const paymentTxn = algosdk.makePaymentTxnWithSuggestedParams(\n sender,\n receiver,\n this.calculatePrice(years),\n closeToRemaninder,\n note,\n params\n );\n\n const lsig = await this.getTeal(this.name);\n\n const appArgs = [];\n appArgs.push(toIntArray(\"renew_name\"));\n appArgs.push(algosdk.encodeUint64(years));\n\n const applicationTxn = algosdk.makeApplicationNoOpTxn(\n sender,\n params,\n this.APP,\n appArgs,\n [lsig.address()]\n );\n\n algosdk.assignGroupID([paymentTxn, applicationTxn]);\n\n return [paymentTxn, applicationTxn];\n }\n\n async prepareUpdateValueTxn(address: string, value: string) {\n const params = await this.rpc.getTransactionParams().do();\n\n const lsig = await this.getTeal(this.name);\n\n const appArgs = [];\n appArgs.push(toIntArray(\"set_default_account\"));\n\n return algosdk.makeApplicationNoOpTxn(address, params, this.APP, appArgs, [\n lsig.address(),\n value,\n ]);\n }\n\n async prepareSetDefaultDomainTxn(address: string) {\n const params = await this.rpc.getTransactionParams().do();\n\n const lsig = await this.getTeal(this.name);\n\n const appArgs = [];\n appArgs.push(toIntArray(\"set_default_account\"));\n\n return algosdk.makeApplicationNoOpTxn(address, params, this.APP, appArgs, [\n lsig.address(),\n ]);\n }\n\n async prepareInitiateNameTransferTransaction(\n sender: string,\n newOwner: string,\n price: number\n ): Promise<Transaction> {\n price = algosdk.algosToMicroalgos(price);\n const params = await this.rpc.getTransactionParams().do();\n\n const lsig = await this.getTeal(this.name);\n\n const appArgs = [];\n appArgs.push(toIntArray(\"initiate_transfer\"));\n appArgs.push(algosdk.encodeUint64(price));\n\n return algosdk.makeApplicationNoOpTxn(sender, params, this.APP, appArgs, [\n lsig.address(),\n newOwner,\n ]);\n }\n\n async prepareAcceptNameTransferTransactions(\n sender: string,\n receiver: string,\n amt: number\n ): Promise<Transaction[]> {\n amt = algosdk.algosToMicroalgos(amt);\n const params = await this.rpc.getTransactionParams().do();\n\n const closeToRemaninder = undefined;\n const note = undefined;\n const paymentToOwnerTxn = algosdk.makePaymentTxnWithSuggestedParams(\n sender,\n receiver,\n amt,\n closeToRemaninder,\n note,\n params\n );\n\n receiver = algosdk.getApplicationAddress(this.APP);\n\n const paymentToSmartContractTxn = algosdk.makePaymentTxnWithSuggestedParams(\n sender,\n receiver,\n TRANSFER_FEE,\n closeToRemaninder,\n note,\n params\n );\n const lsig = await this.getTeal(this.name);\n\n const appArgs = [];\n appArgs.push(toIntArray(\"accept_transfer\"));\n\n const applicationTxn = algosdk.makeApplicationNoOpTxn(\n sender,\n params,\n this.APP,\n appArgs,\n [lsig.address()]\n );\n\n algosdk.assignGroupID([\n paymentToOwnerTxn,\n paymentToSmartContractTxn,\n applicationTxn,\n ]);\n\n return [paymentToOwnerTxn, paymentToSmartContractTxn, applicationTxn];\n }\n}\n","import { Resolver } from \"./resolver.js\";\nimport { Transactions } from \"./transactions.js\";\nimport {\n AddressValidationError,\n IncorrectOwnerError,\n InvalidNameError,\n NameNotRegisteredError,\n} from \"./errors.js\";\nimport {\n NameResponse,\n NameConstructor,\n RegistrationTxns,\n} from \"./interfaces.js\";\nimport { isValidAddress } from \"./validation.js\";\nimport { Transaction } from \"algosdk\";\nimport { Record } from \"./interfaces.js\";\n\nexport class Name {\n private resolver: Resolver;\n private transactions: Transactions;\n private _name: string;\n\n constructor(options: NameConstructor) {\n const { name, rpc, indexer, network, app } = options;\n this._name = name;\n this.resolver = new Resolver(rpc, indexer, this, network, app);\n this.transactions = new Transactions(rpc, indexer, this, network, app);\n }\n\n get name(): string {\n return this._name;\n }\n\n async isRegistered(): Promise<boolean> {\n const status: NameResponse = await this.resolver.resolveName();\n return status.found;\n }\n\n async getOwner(): Promise<string> {\n return await this.resolver.owner();\n }\n\n async getValue(): Promise<string> {\n return await this.resolver.value();\n }\n\n async getContent(): Promise<string> {\n return await this.resolver.content();\n }\n\n async getText(key: string): Promise<string> {\n return await this.resolver.text(key);\n }\n\n async getAllInformation(): Promise<NameResponse> {\n return await this.resolver.resolveName();\n }\n\n async getExpiry(): Promise<Date> {\n return await this.resolver.expiry();\n }\n\n async isValidTransaction(\n sender: string,\n receiver?: string,\n method?: string\n ): Promise<\n | boolean\n | IncorrectOwnerError\n | InvalidNameError\n | AddressValidationError\n | NameNotRegisteredError\n > {\n if (!(await this.isRegistered())) {\n throw new NameNotRegisteredError(this._name);\n }\n if (!isValidAddress(sender)) {\n throw new AddressValidationError();\n }\n if (receiver) {\n if (!isValidAddress(receiver)) throw new AddressValidationError();\n }\n const owner: string | NameNotRegisteredError = await this.getOwner();\n\n if (!(await isValidAddress(sender))) {\n throw new AddressValidationError();\n }\n if (!receiver && !method) {\n if (owner !== sender) {\n throw new IncorrectOwnerError(this._name, sender);\n }\n } else if (sender && receiver) {\n if (method === \"initiate_transfer\") {\n if (owner !== sender) {\n throw new IncorrectOwnerError(this._name, sender);\n }\n } else if (method === \"accept_transfer\") {\n if (owner !== receiver) {\n throw new IncorrectOwnerError(this._name, receiver);\n }\n }\n }\n return true;\n }\n\n async register(address: string, period: number): Promise<RegistrationTxns> {\n if (await this.isRegistered()) {\n throw new Error(\"Name already registered\");\n }\n if (!isValidAddress(address)) {\n throw new AddressValidationError();\n }\n\n return await this.transactions.prepareNameRegistrationTransactions(\n address,\n period\n );\n }\n\n async update(address: string, editedHandles: Record): Promise<Transaction[]> {\n await this.isValidTransaction(address);\n return await this.transactions.prepareUpdateNamePropertyTransactions(\n address,\n editedHandles\n );\n }\n\n async renew(address: string, years: number): Promise<Transaction[]> {\n await this.isValidTransaction(address);\n return await this.transactions.prepareNameRenewalTxns(address, years);\n }\n\n async setValue(address: string, value: string): Promise<Transaction> {\n await this.isValidTransaction(address);\n return await this.transactions.prepareUpdateValueTxn(address, value);\n }\n\n async setDefaultDomain(address: string): Promise<Transaction> {\n await this.isValidTransaction(address);\n return await this.transactions.prepareSetDefaultDomainTxn(address);\n }\n\n async initTransfer(\n owner: string,\n newOwner: string,\n price: number\n ): Promise<Transaction> {\n await this.isValidTransaction(owner, newOwner, \"initiate_transfer\");\n return await this.transactions.prepareInitiateNameTransferTransaction(\n owner,\n newOwner,\n price\n );\n }\n\n async acceptTransfer(\n newOwner: string,\n owner: string,\n price: number\n ): Promise<Transaction[]> {\n await this.isValidTransaction(newOwner, owner, \"accept_transfer\");\n return await this.transactions.prepareAcceptNameTransferTransactions(\n newOwner,\n owner,\n price\n );\n }\n}\n","import { Resolver } from \"./resolver.js\";\nimport { AddressConstructor, Domain, DomainOptions } from \"./interfaces.js\";\n\nexport class Address {\n private address: string;\n private resolver: Resolver;\n\n constructor(options: AddressConstructor) {\n const { address, rpc, indexer, network, app } = options;\n this.address = address;\n this.resolver = new Resolver(rpc, indexer, undefined, network, app);\n }\n\n async getNames(options?: DomainOptions): Promise<Domain[]> {\n return await this.resolver.getNamesOwnedByAddress(\n this.address,\n options?.socials,\n options?.metadata,\n options?.limit\n );\n }\n\n async getDefaultDomain(): Promise<string | Error> {\n return await this.resolver.getDefaultDomain(this.address);\n }\n}\n"],"mappings":"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