@bonfida/spl-name-service 0.2.1 → 0.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -71,3 +71,11 @@ export declare const registerDomainName: (connection: Connection, name: string,
71
71
  * @returns
72
72
  */
73
73
  export declare const createReverseName: (nameAccount: PublicKey, name: string, feePayer: PublicKey, parentName?: PublicKey, parentNameOwner?: PublicKey) => Promise<TransactionInstruction[][]>;
74
+ /**
75
+ * This function can be used to create a subdomain
76
+ * @param connection The Solana RPC connection object
77
+ * @param subdomain The subdomain to create with or without .sol e.g something.bonfida.sol or something.bonfida
78
+ * @param owner The owner of the parent domain creating the subdomain
79
+ * @param space The space to allocate to the subdomain (defaults to 2kb)
80
+ */
81
+ export declare const createSubdomain: (connection: Connection, subdomain: string, owner: PublicKey, space?: number) => Promise<TransactionInstruction[][]>;
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- "use strict";var e=require("@solana/web3.js"),t=require("@solana/spl-token"),r=require("bn.js"),i=require("borsh"),s=require("@ethersproject/sha2"),a=require("@pythnetwork/client"),n=require("@bonfida/name-offers"),o=require("tweetnacl");class c extends r{toBuffer(){const e=super.toArray().reverse(),t=Buffer.from(e);if(4===t.length)return t;if(t.length>4)throw new Error("Numberu32 too large");const r=Buffer.alloc(4);return t.copy(r),r}static fromBuffer(e){if(4!==e.length)throw new Error(`Invalid buffer length: ${e.length}`);return new r([...e].reverse().map((e=>`00${e.toString(16)}`.slice(-2))).join(""),16)}}class u extends r{toBuffer(){const e=super.toArray().reverse(),t=Buffer.from(e);if(8===t.length)return t;if(t.length>8)throw new Error("Numberu64 too large");const r=Buffer.alloc(8);return t.copy(r),r}static fromBuffer(e){if(8!==e.length)throw new Error(`Invalid buffer length: ${e.length}`);return new r([...e].reverse().map((e=>`00${e.toString(16)}`.slice(-2))).join(""),16)}}function p(t,r,i,s,a,n,o,u,p,l,f){const d=[Buffer.from(Int8Array.from([0])),new c(n.length).toBuffer(),n,o.toBuffer(),u.toBuffer()],y=Buffer.concat(d),w=[{pubkey:r,isSigner:!1,isWritable:!1},{pubkey:a,isSigner:!0,isWritable:!0},{pubkey:i,isSigner:!1,isWritable:!0},{pubkey:s,isSigner:!1,isWritable:!1}];return p?w.push({pubkey:p,isSigner:!0,isWritable:!1}):w.push({pubkey:new e.PublicKey(Buffer.alloc(32)),isSigner:!1,isWritable:!1}),l?w.push({pubkey:l,isSigner:!1,isWritable:!1}):w.push({pubkey:new e.PublicKey(Buffer.alloc(32)),isSigner:!1,isWritable:!1}),f&&w.push({pubkey:f,isSigner:!0,isWritable:!1}),new e.TransactionInstruction({keys:w,programId:t,data:y})}function l(t,r,i,s,a){const n=[Buffer.from(Int8Array.from([1])),i.toBuffer(),new c(s.length).toBuffer(),s],o=Buffer.concat(n),u=[{pubkey:r,isSigner:!1,isWritable:!0},{pubkey:a,isSigner:!0,isWritable:!1}];return new e.TransactionInstruction({keys:u,programId:t,data:o})}function f(t,r,i,s,a,n,o){const c=[Buffer.from(Int8Array.from([2])),i.toBuffer()],u=Buffer.concat(c),p=[{pubkey:r,isSigner:!1,isWritable:!0},{pubkey:o||s,isSigner:!0,isWritable:!1}];return a&&p.push({pubkey:a,isSigner:!0,isWritable:!1}),o&&n&&(a||p.push({pubkey:e.PublicKey.default,isSigner:!1,isWritable:!1}),p.push({pubkey:n,isSigner:!1,isWritable:!1})),new e.TransactionInstruction({keys:p,programId:t,data:u})}function d(t,r,i,s){const a=[Buffer.from(Int8Array.from([3]))],n=Buffer.concat(a),o=[{pubkey:r,isSigner:!1,isWritable:!0},{pubkey:s,isSigner:!0,isWritable:!1},{pubkey:i,isSigner:!1,isWritable:!0}];return new e.TransactionInstruction({keys:o,programId:t,data:n})}class y{constructor(e){this.tag=9,this.name=e.name,this.space=e.space}serialize(){return i.serialize(y.schema,this)}getInstruction(r,i,s,a,n,o,c,u,p,l,f){const d=Buffer.from(this.serialize()),y=[{pubkey:i,isSigner:!1,isWritable:!1},{pubkey:s,isSigner:!1,isWritable:!1},{pubkey:a,isSigner:!1,isWritable:!1},{pubkey:n,isSigner:!1,isWritable:!0},{pubkey:o,isSigner:!1,isWritable:!0},{pubkey:e.SystemProgram.programId,isSigner:!1,isWritable:!1},{pubkey:c,isSigner:!1,isWritable:!1},{pubkey:u,isSigner:!0,isWritable:!0},{pubkey:p,isSigner:!1,isWritable:!0},{pubkey:l,isSigner:!1,isWritable:!0},{pubkey:t.TOKEN_PROGRAM_ID,isSigner:!1,isWritable:!1},{pubkey:f,isSigner:!1,isWritable:!1}];return new e.TransactionInstruction({keys:y,programId:r,data:d})}}y.schema=new Map([[y,{kind:"struct",fields:[["tag","u8"],["name","string"],["space","u32"]]}]]);class w{constructor(e){this.tag=5,this.name=e.name}serialize(){return i.serialize(w.schema,this)}getInstruction(t,r,i,s,a,n,o,c,u){const p=Buffer.from(this.serialize());let l=[{pubkey:r,isSigner:!1,isWritable:!1},{pubkey:i,isSigner:!1,isWritable:!1},{pubkey:s,isSigner:!1,isWritable:!1},{pubkey:a,isSigner:!1,isWritable:!0},{pubkey:e.PublicKey.default,isSigner:!1,isWritable:!1},{pubkey:n,isSigner:!1,isWritable:!1},{pubkey:o,isSigner:!0,isWritable:!0}];if(c){if(!u)throw new Error("Missing parent name owner");l.push({pubkey:c,isSigner:!1,isWritable:!0}),l.push({pubkey:u,isSigner:!0,isWritable:!1})}return new e.TransactionInstruction({keys:l,programId:t,data:p})}}w.schema=new Map([[w,{kind:"struct",fields:[["tag","u8"],["name","string"]]}]]);class g{constructor(e){this.tag=13,this.name=e.name,this.space=e.space,this.referrerIdxOpt=e.referrerIdxOpt}serialize(){return i.serialize(g.schema,this)}getInstruction(t,r,i,s,a,n,o,c,u,p,l,f,d,y,w,g,m){const b=Buffer.from(this.serialize());let h=[];return h.push({pubkey:r,isSigner:!1,isWritable:!1}),h.push({pubkey:i,isSigner:!1,isWritable:!1}),h.push({pubkey:s,isSigner:!1,isWritable:!0}),h.push({pubkey:a,isSigner:!1,isWritable:!0}),h.push({pubkey:n,isSigner:!1,isWritable:!1}),h.push({pubkey:o,isSigner:!1,isWritable:!1}),h.push({pubkey:c,isSigner:!0,isWritable:!0}),h.push({pubkey:u,isSigner:!1,isWritable:!0}),h.push({pubkey:p,isSigner:!1,isWritable:!1}),h.push({pubkey:l,isSigner:!1,isWritable:!1}),h.push({pubkey:f,isSigner:!1,isWritable:!1}),h.push({pubkey:d,isSigner:!1,isWritable:!0}),h.push({pubkey:y,isSigner:!1,isWritable:!1}),h.push({pubkey:w,isSigner:!1,isWritable:!1}),h.push({pubkey:g,isSigner:!1,isWritable:!1}),m&&h.push({pubkey:m,isSigner:!1,isWritable:!0}),new e.TransactionInstruction({keys:h,programId:t,data:b})}}g.schema=new Map([[g,{kind:"struct",fields:[["tag","u8"],["name","string"],["space","u32"],["referrerIdxOpt",{kind:"option",type:"u16"}]]}]]);const m=new e.PublicKey("nftD3vbNkNqfj2Sd3HZwbpw4BxxKWr4AjGb9X38JeZk"),b=Buffer.from("tokenized_name"),h=async(r,i)=>{try{const[s]=await e.PublicKey.findProgramAddress([b,i.toBuffer()],m);if("0"===(await t.getMint(r,s)).supply.toString())return;const a=[{memcmp:{offset:0,bytes:s.toBase58()}},{memcmp:{offset:64,bytes:"2"}},{dataSize:165}],n=await r.getProgramAccounts(t.TOKEN_PROGRAM_ID,{filters:a});if(1!=n.length)return;return new e.PublicKey(n[0].account.data.slice(32,64))}catch{return}};class S{constructor(t){this.parentName=new e.PublicKey(t.parentName),this.owner=new e.PublicKey(t.owner),this.class=new e.PublicKey(t.class)}static async retrieve(e,t){var r;const s=await e.getAccountInfo(t);if(!s)throw new Error("Invalid name account provided");let a=i.deserializeUnchecked(this.schema,S,s.data);a.data=null===(r=s.data)||void 0===r?void 0:r.slice(this.HEADER_LEN);return{registry:a,nftOwner:await h(e,t)}}static async _retrieveBatch(e,t){const r=await e.getMultipleAccountsInfo(t),s=e=>{if(!e)return;const t=i.deserializeUnchecked(this.schema,S,e);return t.data=null==e?void 0:e.slice(this.HEADER_LEN),t};return r.map((e=>s(null==e?void 0:e.data)))}static async retrieveBatch(e,t){let r=[];const i=[...t];for(;i.length>0;)r.push(...await this._retrieveBatch(e,i.splice(0,100)));return r}}S.HEADER_LEN=96,S.schema=new Map([[S,{kind:"struct",fields:[["parentName",[32]],["owner",[32]],["class",[32]]]}]]);class R{constructor(e){this.name=e.name,this.ticker=e.ticker,this.mint=e.mint,this.decimals=e.decimals,this.website=null==e?void 0:e.website,this.logoUri=null==e?void 0:e.logoUri}serialize(){return i.serialize(R.schema,this)}static deserialize(e){return i.deserializeUnchecked(R.schema,R,e)}}R.schema=new Map([[R,{kind:"struct",fields:[["name","string"],["ticker","string"],["mint",[32]],["decimals","u8"],["website",{kind:"option",type:"string"}],["logoUri",{kind:"option",type:"string"}]]}]]);class x{constructor(e){this.mint=e.mint}serialize(){return i.serialize(x.schema,this)}static deserialize(e){return i.deserializeUnchecked(x.schema,x,e)}}x.schema=new Map([[x,{kind:"struct",fields:[["mint",[32]]]}]]);const k=new e.PublicKey("namesLPneVptA9Z5rqUDD9tMTWEJwofgaYwp8cawRkX"),v="SPL Name Service",E=new e.PublicKey("58PwtjSDuFHuUkYjH9BYnnQKHfwo9reZhC2zMJv9JPkx"),B=new e.PublicKey("jCebN34bUfdeUYJT13J1yG16XWQpt5PDx6Mse9GUqhR"),P=new e.PublicKey("ETp9eKXVv1dWwHSpsXRUuXHmw24PwRkttCGVgpZEY9zF"),I=new e.PublicKey("AUoZ3YAhV3b2rZeEH93UMZHXUZcTramBvb4d9YEVySkc"),A=new e.PublicKey("33m47vH6Eav6jr5Ry86XjhRft2jRBLDnDgPSHoquXi2Z"),T=new e.PublicKey("FvPH7PrVrLGKPfqaf3xJodFTjZriqrAXXLTVWEorTFBi"),W=new e.PublicKey("4YcexoW3r78zz16J2aqmukBLRwGq6rAvWzJpkYAXqebv"),K=new e.PublicKey("DmSyHDSM9eSLyvoLsPvDr5fRRFZ7Bfr3h3ULvWpgQaq7"),N=new e.PublicKey("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"),D=[new e.PublicKey("3ogYncmMM5CmytsGCqKHydmXmKUZ6sGWvizkzqwT7zb1"),new e.PublicKey("DM1jJCkZZEwY5tmWbgvKRxsDFzXCdbfrYCCH1CtwguEs")],_=new Map([["EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","USDC"],["Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB","USDT"],["So11111111111111111111111111111111111111112","SOL"],["EchesyfXePKdLtoiZSL8pBe8Myagyy8ZRqsACNCFGnvp","FIDA"],["FeGn77dhg1KXRRFeSwwMiykZnZPw5JXW6naf2aQgZDQf","ETH"],["mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So","MSOL"]]),H=new e.PublicKey("AHtgzX45WTKfkPG53L6WYhGEXwQkN1BVknET3sVsLL8J"),O=new e.PublicKey("GcWEQ9K78FV7LEHteFVciYApERk5YvQuFDQPk1yYJVXi");async function C(e,t){if(!await e.getAccountInfo(t))throw new Error("Unable to find the given account.");return S.retrieve(e,t)}async function L(e){const t=v+e,r=s.sha256(Buffer.from(t,"utf8")).slice(2);return Buffer.from(r,"hex")}async function M(t,r,i){const s=[t];r?s.push(r.toBuffer()):s.push(Buffer.alloc(32)),i?s.push(i.toBuffer()):s.push(Buffer.alloc(32));const[a]=await e.PublicKey.findProgramAddress(s,k);return a}const F=async(e,t=E)=>{let r=await L(e);return{pubkey:await M(r,void 0,t),hashed:r}},z=async(e,t=!1)=>{e.endsWith(".sol")&&(e=e.slice(0,-4));const r=e.split(".");if(2===r.length){const e=Buffer.from([t?1:0]).toString().concat(r[0]),{pubkey:i}=await F(r[1]);return{...await F(e,i),isSub:!0,parent:i}}if(3===r.length&&t){const{pubkey:e}=await F(r[2]),{pubkey:t}=await F("\0".concat(r[1]),e),i=Buffer.from([1]).toString();return{...await F(i.concat(r[0]),t),isSub:!0,parent:e,isSubRecord:!0}}if(r.length>=3)throw new Error("Invalid derivation input");return{...await F(e,E),isSub:!1,parent:void 0}},U=e=>{const t=v+e,r=s.sha256(Buffer.from(t,"utf8")).slice(2);return Buffer.from(r,"hex")},G=(t,r,i)=>{const s=[t];r?s.push(r.toBuffer()):s.push(Buffer.alloc(32)),i?s.push(i.toBuffer()):s.push(Buffer.alloc(32));const[a]=e.PublicKey.findProgramAddressSync(s,k);return a};async function Y(e,t){const i=U(t.toBase58()),s=G(i,A),{registry:a}=await S.retrieve(e,s);if(!a.data)throw new Error("Could not retrieve name data");const n=new r(a.data.slice(0,4),"le").toNumber();return a.data.slice(4,4+n).toString()}const q=(e,t=E)=>{let r=U(e);return{pubkey:G(r,void 0,t),hashed:r}},V=(e,t=!1)=>{e.endsWith(".sol")&&(e=e.slice(0,-4));const r=e.split(".");if(2===r.length){const e=Buffer.from([t?1:0]).toString().concat(r[0]),{pubkey:i}=q(r[1]);return{...q(e,i),isSub:!0,parent:i}}if(3===r.length&&t){const{pubkey:e}=q(r[2]),{pubkey:t}=q("\0".concat(r[1]),e),i=Buffer.from([1]).toString();return{...q(i.concat(r[0]),t),isSub:!0,parent:e,isSubRecord:!0}}if(r.length>=3)throw new Error("Invalid derivation input");return{...q(e,E),isSub:!1,parent:void 0}};async function Z(e,t,r,i,s){const a=await L(t),n=await M(a,i,s);let o;o=i||(await S.retrieve(e,n)).registry.owner;return d(k,n,r,o)}class j{constructor(e){this.twitterRegistryKey=e.twitterRegistryKey,this.twitterHandle=e.twitterHandle}static async retrieve(e,t){let r=await e.getAccountInfo(t,"processed");if(!r)throw new Error("Invalid reverse Twitter account provided");return i.deserializeUnchecked(this.schema,j,r.data.slice(S.HEADER_LEN))}}async function X(t,r,s,a,n){const o=await L(a.toString()),f=await M(o,T,W);let d=i.serialize(j.schema,new j({twitterRegistryKey:s.toBytes(),twitterHandle:r}));return[p(k,e.SystemProgram.programId,f,a,n,o,new u(await t.getMinimumBalanceForRentExemption(d.length+S.HEADER_LEN)),new c(d.length),T,W,T),l(k,f,new c(0),Buffer.from(d),T)]}j.schema=new Map([[j,{kind:"struct",fields:[["twitterRegistryKey",[32]],["twitterHandle","string"]]}]]);const J=new e.PublicKey("6NSu2tci4apRKQtt257bAVcvqYjB3zV2H1dWo56vgpa6"),Q=async(e,t)=>{const r=await M(await L(t.toBase58()),void 0,J),{registry:i}=await S.retrieve(e,r);if(!i.data)throw new Error("Invalid account data");return R.deserialize(i.data)};var $;exports.Record=void 0,($=exports.Record||(exports.Record={})).IPFS="IPFS",$.ARWV="ARWV",$.SOL="SOL",$.ETH="ETH",$.BTC="BTC",$.LTC="LTC",$.DOGE="DOGE",$.Email="email",$.Url="url",$.Discord="discord",$.Github="github",$.Reddit="reddit",$.Twitter="twitter",$.Telegram="telegram",$.Pic="pic",$.SHDW="SHDW",$.POINT="POINT",$.BSC="BSC",$.Injective="INJECT";const ee=(e,t)=>{const{pubkey:r}=V(t+"."+e,!0);return r},te=async(e,t,r)=>{var i,s;const a=ee(t,r);let{registry:n}=await S.retrieve(e,a);const o=r===exports.Record.SOL?96:null===(i=n.data)||void 0===i?void 0:i.indexOf(0);return n.data=null===(s=n.data)||void 0===s?void 0:s.slice(0,o),n},re=async(e,t)=>await te(e,t,exports.Record.SOL),ie=(e,t,r)=>o.sign.detached.verify(e,t,r.toBytes());exports.BONFIDA_FIDA_BNB=I,exports.BONFIDA_USDC_BNB=K,exports.HASH_PREFIX=v,exports.MINT_PREFIX=b,exports.Mint=x,exports.NAME_PROGRAM_ID=k,exports.NAME_TOKENIZER_ID=m,exports.NameRegistryState=S,exports.Numberu32=c,exports.Numberu64=u,exports.PYTH_FIDA_PRICE_ACC=P,exports.PYTH_MAPPING_ACC=H,exports.REFERRERS=D,exports.REGISTER_PROGRAM_ID=B,exports.REVERSE_LOOKUP_CLASS=A,exports.ROOT_DOMAIN_ACCOUNT=E,exports.ReverseTwitterRegistryState=j,exports.SOL_RECORD_SIG_LEN=96,exports.TOKENS_SYM_MINT=_,exports.TOKEN_TLD=J,exports.TWITTER_ROOT_PARENT_REGISTRY_KEY=W,exports.TWITTER_VERIFICATION_AUTHORITY=T,exports.TokenData=R,exports.USDC_MINT=N,exports.VAULT_OWNER=O,exports.changeTwitterRegistryData=async function(e,t,r,i){const s=await L(e),a=await M(s,void 0,W);return[l(k,a,new c(r),i,t)]},exports.changeVerifiedPubkey=async function(e,t,r,i,s){const a=await L(t),n=await M(a,void 0,W);let o=[f(k,n,i,r,void 0)];const c=await L(r.toString());return await M(c,T,void 0),o.push(await Z(e,r.toString(),s,T,W)),o=o.concat(await X(e,t,n,i,s)),o},exports.checkSolRecord=ie,exports.createInstruction=p,exports.createInstructionV3=g,exports.createNameRegistry=async function(t,r,i,s,a,n,o,l){const f=await L(r),d=await M(f,o,l),y=n||await t.getMinimumBalanceForRentExemption(i);let w;if(l){const{registry:e}=await C(t,l);w=e.owner}return p(k,e.SystemProgram.programId,d,a,s,f,new u(y),new c(i),o,l,w)},exports.createReverseInstruction=w,exports.createReverseName=async(t,r,i,s,a)=>{let[n]=await e.PublicKey.findProgramAddress([B.toBuffer()],B),o=await L(t.toBase58()),c=await M(o,n,s);return[[],[new w({name:r}).getInstruction(B,e.SYSVAR_RENT_PUBKEY,k,E,c,n,i,s,a)]]},exports.createReverseTwitterRegistry=X,exports.createV2Instruction=y,exports.createVerifiedTwitterRegistry=async function(t,r,i,s,a){const n=await L(r),o=await M(n,void 0,W),l=await t.getMinimumBalanceForRentExemption(s+S.HEADER_LEN);let f=[p(k,e.SystemProgram.programId,o,i,a,n,new u(l),new c(s),void 0,W,T)];return f=f.concat(await X(t,r,o,i,a)),f},exports.deleteInstruction=d,exports.deleteNameRegistry=Z,exports.deleteTwitterRegistry=async function(e,t){const r=await L(e),i=await M(r,void 0,W),s=await L(t.toString()),a=await M(s,T,W);return[d(k,i,t,t),d(k,a,t,t)]},exports.findSubdomains=async(e,t)=>{const r=[{memcmp:{offset:0,bytes:t.toBase58()}},{memcmp:{offset:64,bytes:A.toBase58()}}],i=await e.getProgramAccounts(k,{filters:r}),s=await Y(e,t),a=i.map((e=>{var t;return null===(t=e.account.data.slice(97).toString("utf-8"))||void 0===t?void 0:t.split("\0").join("")})),n=a.map((e=>V(e+"."+s).pubkey)),o=await e.getMultipleAccountsInfo(n);return a.filter(((e,t)=>!!o[t]))},exports.getAllDomains=async function(e,t){const r=[{memcmp:{offset:32,bytes:t.toBase58()}},{memcmp:{offset:0,bytes:E.toBase58()}}];return(await e.getProgramAccounts(k,{filters:r})).map((e=>e.pubkey))},exports.getAllRegisteredDomains=async e=>{const t=[{memcmp:{offset:0,bytes:E.toBase58()}}];return await e.getProgramAccounts(k,{dataSlice:{offset:32,length:32},filters:t})},exports.getArweaveRecord=async(e,t)=>await te(e,t,exports.Record.ARWV),exports.getBscRecord=async(e,t)=>await te(e,t,exports.Record.BSC),exports.getBtcRecord=async(e,t)=>await te(e,t,exports.Record.BTC),exports.getDiscordRecord=async(e,t)=>await te(e,t,exports.Record.Discord),exports.getDogeRecord=async(e,t)=>await te(e,t,exports.Record.DOGE),exports.getDomainKey=z,exports.getDomainKeySync=V,exports.getEmailRecord=async(e,t)=>await te(e,t,exports.Record.Email),exports.getEthRecord=async(e,t)=>await te(e,t,exports.Record.ETH),exports.getFavoriteDomain=async(t,r)=>{const[i]=await n.FavouriteDomain.getKey(n.NAME_OFFERS_ID,new e.PublicKey(r)),s=await n.FavouriteDomain.retrieve(t,i),a=await Y(t,s.nameAccount);return{domain:s.nameAccount,reverse:a}},exports.getGithubRecord=async(e,t)=>await te(e,t,exports.Record.Github),exports.getHandleAndRegistryKey=async function(t,r){const i=await L(r.toString()),s=await M(i,T,W);let a=await j.retrieve(t,s);return[a.twitterHandle,new e.PublicKey(a.twitterRegistryKey)]},exports.getHashedName=L,exports.getHashedNameSync=U,exports.getInjectiveRecord=async(e,t)=>await te(e,t,exports.Record.Injective),exports.getIpfsRecord=async(e,t)=>await te(e,t,exports.Record.IPFS),exports.getLtcRecord=async(e,t)=>await te(e,t,exports.Record.LTC),exports.getNameAccountKey=M,exports.getNameAccountKeySync=G,exports.getNameOwner=C,exports.getPicRecord=async(e,t)=>await te(e,t,exports.Record.Pic),exports.getPointRecord=async(e,t)=>await te(e,t,exports.Record.POINT),exports.getRecord=te,exports.getRecordKeySync=ee,exports.getRedditRecord=async(e,t)=>await te(e,t,exports.Record.Reddit),exports.getReverseKey=async(e,t)=>{const{pubkey:r,parent:i}=await z(e),s=await L(r.toBase58());return await M(s,A,t?i:void 0)},exports.getReverseKeySync=(e,t)=>{const{pubkey:r,parent:i}=V(e),s=U(r.toBase58());return G(s,A,t?i:void 0)},exports.getShdwRecord=async(e,t)=>await te(e,t,exports.Record.SHDW),exports.getSolRecord=re,exports.getTelegramRecord=async(e,t)=>await te(e,t,exports.Record.Telegram),exports.getTokenInfoFromMint=Q,exports.getTokenInfoFromName=async(t,r)=>{const i=await M(await L(r),void 0,J),{registry:s}=await S.retrieve(t,i);if(!s.data)throw new Error("Invalid account data");const a=new e.PublicKey(x.deserialize(s.data).mint);return await Q(t,a)},exports.getTwitterHandleandRegistryKeyViaFilters=async function(t,r){const s=[{memcmp:{offset:0,bytes:W.toBase58()}},{memcmp:{offset:32,bytes:r.toBase58()}},{memcmp:{offset:64,bytes:T.toBase58()}}],a=await t.getProgramAccounts(k,{filters:s});for(const t of a)if(t.account.data.length>S.HEADER_LEN+32){let r=t.account.data.slice(S.HEADER_LEN),s=i.deserializeUnchecked(j.schema,j,r);return[s.twitterHandle,new e.PublicKey(s.twitterRegistryKey)]}throw new Error("Registry not found.")},exports.getTwitterRecord=async(e,t)=>await te(e,t,exports.Record.Twitter),exports.getTwitterRegistry=async function(e,t){const r=await L(t),i=await M(r,void 0,W),{registry:s}=await S.retrieve(e,i);return s},exports.getTwitterRegistryData=async function(t,r){const i=[{memcmp:{offset:0,bytes:W.toBase58()}},{memcmp:{offset:32,bytes:r.toBase58()}},{memcmp:{offset:64,bytes:new e.PublicKey(Buffer.alloc(32,0)).toBase58()}}],s=await t.getProgramAccounts(k,{filters:i});if(s.length>1)throw new Error("Found more than one registry.");return s[0].account.data.slice(S.HEADER_LEN)},exports.getTwitterRegistryKey=async function(e){const t=await L(e);return await M(t,void 0,W)},exports.getUrlRecord=async(e,t)=>await te(e,t,exports.Record.Url),exports.performReverseLookup=async function(e,t){const i=await L(t.toBase58()),s=await M(i,A),{registry:a}=await S.retrieve(e,s);if(!a.data)throw new Error("Could not retrieve name data");const n=new r(a.data.slice(0,4),"le").toNumber();return a.data.slice(4,4+n).toString()},exports.performReverseLookupBatch=async function(e,t){let i=[];for(let e of t){const t=await L(e.toBase58()),r=await M(t,A);i.push(r)}return(await S.retrieveBatch(e,i)).map((e=>{if(void 0===e||void 0===e.data)return;let t=new r(e.data.slice(0,4),"le").toNumber();return e.data.slice(4,4+t).toString()}))},exports.registerDomainName=async(r,i,s,n,o,c=N,u)=>{const[p]=e.PublicKey.findProgramAddressSync([B.toBuffer()],B),l=U(i),f=G(l,void 0,E),d=U(f.toBase58()),y=G(d,p),[w]=e.PublicKey.findProgramAddressSync([f.toBuffer()],B),m=D.findIndex((e=>null==u?void 0:u.equals(e))),b=new a.PythHttpClient(r,a.getPythProgramKeyForCluster("mainnet-beta")),h=await b.getData(),S=_.get(c.toBase58());if(!S)throw new Error("Symbol not found");const R=h.productPrice.get("Crypto."+S+"/USD"),x=h.productFromSymbol.get("Crypto."+S+"/USD"),v=t.getAssociatedTokenAddressSync(c,O);return[[],[new g({name:i,space:s,referrerIdxOpt:-1!=m?m:null}).getInstruction(B,k,E,f,y,e.SystemProgram.programId,p,n,o,H,R.productAccountKey,new e.PublicKey(x.price_account),v,t.TOKEN_PROGRAM_ID,e.SYSVAR_RENT_PUBKEY,w,u)]]},exports.resolve=async(t,r)=>{const{pubkey:i}=V(r),{registry:s,nftOwner:a}=await S.retrieve(t,i);if(a)return a;try{const i=V(exports.Record.SOL+"."+r,!0),a=await re(t,r);if(!a.data)throw new Error("Invalid SOL record data");const n=new TextEncoder,o=Buffer.concat([a.data.slice(0,32),i.pubkey.toBuffer()]),c=n.encode(o.toString("hex"));if(!ie(c,a.data.slice(32),s.owner))throw new Error("Signature invalid");return new e.PublicKey(a.data.slice(0,32))}catch(e){if(e instanceof Error&&"FetchError"===e.name)throw e;console.log(e)}return s.owner},exports.retrieveNftOwner=h,exports.retrieveNfts=async t=>{const r=await t.getProgramAccounts(m,{filters:[{memcmp:{offset:0,bytes:"3"}}]});return r.map((t=>new e.PublicKey(t.account.data.slice(66,98))))},exports.reverseLookup=Y,exports.reverseLookupBatch=async function(e,t){let i=[];for(let e of t){const t=U(e.toBase58()),r=G(t,A);i.push(r)}return(await S.retrieveBatch(e,i)).map((e=>{if(void 0===e||void 0===e.data)return;let t=new r(e.data.slice(0,4),"le").toNumber();return e.data.slice(4,4+t).toString()}))},exports.transferInstruction=f,exports.transferNameOwnership=async function(e,t,r,i,s,a){const n=await L(t),o=await M(n,i,s);let c;return c=i||(await S.retrieve(e,o)).registry.owner,f(k,o,r,c,i,s,a)},exports.updateInstruction=l,exports.updateNameRegistryData=async function(e,t,r,i,s,a){const n=await L(t),o=await M(n,s,a);let u;return u=s||(await S.retrieve(e,o)).registry.owner,l(k,o,new c(r),i,u)};
1
+ "use strict";var e=require("@solana/web3.js"),t=require("@solana/spl-token"),r=require("bn.js"),i=require("borsh"),s=require("@ethersproject/sha2"),a=require("@pythnetwork/client"),n=require("@bonfida/name-offers"),o=require("tweetnacl");class c extends r{toBuffer(){const e=super.toArray().reverse(),t=Buffer.from(e);if(4===t.length)return t;if(t.length>4)throw new Error("Numberu32 too large");const r=Buffer.alloc(4);return t.copy(r),r}static fromBuffer(e){if(4!==e.length)throw new Error(`Invalid buffer length: ${e.length}`);return new r([...e].reverse().map((e=>`00${e.toString(16)}`.slice(-2))).join(""),16)}}class u extends r{toBuffer(){const e=super.toArray().reverse(),t=Buffer.from(e);if(8===t.length)return t;if(t.length>8)throw new Error("Numberu64 too large");const r=Buffer.alloc(8);return t.copy(r),r}static fromBuffer(e){if(8!==e.length)throw new Error(`Invalid buffer length: ${e.length}`);return new r([...e].reverse().map((e=>`00${e.toString(16)}`.slice(-2))).join(""),16)}}function p(t,r,i,s,a,n,o,u,p,l,d){const f=[Buffer.from(Int8Array.from([0])),new c(n.length).toBuffer(),n,o.toBuffer(),u.toBuffer()],y=Buffer.concat(f),w=[{pubkey:r,isSigner:!1,isWritable:!1},{pubkey:a,isSigner:!0,isWritable:!0},{pubkey:i,isSigner:!1,isWritable:!0},{pubkey:s,isSigner:!1,isWritable:!1}];return p?w.push({pubkey:p,isSigner:!0,isWritable:!1}):w.push({pubkey:new e.PublicKey(Buffer.alloc(32)),isSigner:!1,isWritable:!1}),l?w.push({pubkey:l,isSigner:!1,isWritable:!1}):w.push({pubkey:new e.PublicKey(Buffer.alloc(32)),isSigner:!1,isWritable:!1}),d&&w.push({pubkey:d,isSigner:!0,isWritable:!1}),new e.TransactionInstruction({keys:w,programId:t,data:y})}function l(t,r,i,s,a){const n=[Buffer.from(Int8Array.from([1])),i.toBuffer(),new c(s.length).toBuffer(),s],o=Buffer.concat(n),u=[{pubkey:r,isSigner:!1,isWritable:!0},{pubkey:a,isSigner:!0,isWritable:!1}];return new e.TransactionInstruction({keys:u,programId:t,data:o})}function d(t,r,i,s,a,n,o){const c=[Buffer.from(Int8Array.from([2])),i.toBuffer()],u=Buffer.concat(c),p=[{pubkey:r,isSigner:!1,isWritable:!0},{pubkey:o||s,isSigner:!0,isWritable:!1}];return a&&p.push({pubkey:a,isSigner:!0,isWritable:!1}),o&&n&&(a||p.push({pubkey:e.PublicKey.default,isSigner:!1,isWritable:!1}),p.push({pubkey:n,isSigner:!1,isWritable:!1})),new e.TransactionInstruction({keys:p,programId:t,data:u})}function f(t,r,i,s){const a=[Buffer.from(Int8Array.from([3]))],n=Buffer.concat(a),o=[{pubkey:r,isSigner:!1,isWritable:!0},{pubkey:s,isSigner:!0,isWritable:!1},{pubkey:i,isSigner:!1,isWritable:!0}];return new e.TransactionInstruction({keys:o,programId:t,data:n})}class y{constructor(e){this.tag=9,this.name=e.name,this.space=e.space}serialize(){return i.serialize(y.schema,this)}getInstruction(r,i,s,a,n,o,c,u,p,l,d){const f=Buffer.from(this.serialize()),y=[{pubkey:i,isSigner:!1,isWritable:!1},{pubkey:s,isSigner:!1,isWritable:!1},{pubkey:a,isSigner:!1,isWritable:!1},{pubkey:n,isSigner:!1,isWritable:!0},{pubkey:o,isSigner:!1,isWritable:!0},{pubkey:e.SystemProgram.programId,isSigner:!1,isWritable:!1},{pubkey:c,isSigner:!1,isWritable:!1},{pubkey:u,isSigner:!0,isWritable:!0},{pubkey:p,isSigner:!1,isWritable:!0},{pubkey:l,isSigner:!1,isWritable:!0},{pubkey:t.TOKEN_PROGRAM_ID,isSigner:!1,isWritable:!1},{pubkey:d,isSigner:!1,isWritable:!1}];return new e.TransactionInstruction({keys:y,programId:r,data:f})}}y.schema=new Map([[y,{kind:"struct",fields:[["tag","u8"],["name","string"],["space","u32"]]}]]);class w{constructor(e){this.tag=5,this.name=e.name}serialize(){return i.serialize(w.schema,this)}getInstruction(t,r,i,s,a,n,o,c,u){const p=Buffer.from(this.serialize());let l=[{pubkey:r,isSigner:!1,isWritable:!1},{pubkey:i,isSigner:!1,isWritable:!1},{pubkey:s,isSigner:!1,isWritable:!1},{pubkey:a,isSigner:!1,isWritable:!0},{pubkey:e.PublicKey.default,isSigner:!1,isWritable:!1},{pubkey:n,isSigner:!1,isWritable:!1},{pubkey:o,isSigner:!0,isWritable:!0}];if(c){if(!u)throw new Error("Missing parent name owner");l.push({pubkey:c,isSigner:!1,isWritable:!0}),l.push({pubkey:u,isSigner:!0,isWritable:!1})}return new e.TransactionInstruction({keys:l,programId:t,data:p})}}w.schema=new Map([[w,{kind:"struct",fields:[["tag","u8"],["name","string"]]}]]);class g{constructor(e){this.tag=13,this.name=e.name,this.space=e.space,this.referrerIdxOpt=e.referrerIdxOpt}serialize(){return i.serialize(g.schema,this)}getInstruction(t,r,i,s,a,n,o,c,u,p,l,d,f,y,w,g,m){const b=Buffer.from(this.serialize());let h=[];return h.push({pubkey:r,isSigner:!1,isWritable:!1}),h.push({pubkey:i,isSigner:!1,isWritable:!1}),h.push({pubkey:s,isSigner:!1,isWritable:!0}),h.push({pubkey:a,isSigner:!1,isWritable:!0}),h.push({pubkey:n,isSigner:!1,isWritable:!1}),h.push({pubkey:o,isSigner:!1,isWritable:!1}),h.push({pubkey:c,isSigner:!0,isWritable:!0}),h.push({pubkey:u,isSigner:!1,isWritable:!0}),h.push({pubkey:p,isSigner:!1,isWritable:!1}),h.push({pubkey:l,isSigner:!1,isWritable:!1}),h.push({pubkey:d,isSigner:!1,isWritable:!1}),h.push({pubkey:f,isSigner:!1,isWritable:!0}),h.push({pubkey:y,isSigner:!1,isWritable:!1}),h.push({pubkey:w,isSigner:!1,isWritable:!1}),h.push({pubkey:g,isSigner:!1,isWritable:!1}),m&&h.push({pubkey:m,isSigner:!1,isWritable:!0}),new e.TransactionInstruction({keys:h,programId:t,data:b})}}g.schema=new Map([[g,{kind:"struct",fields:[["tag","u8"],["name","string"],["space","u32"],["referrerIdxOpt",{kind:"option",type:"u16"}]]}]]);const m=new e.PublicKey("nftD3vbNkNqfj2Sd3HZwbpw4BxxKWr4AjGb9X38JeZk"),b=Buffer.from("tokenized_name"),h=async(r,i)=>{try{const[s]=await e.PublicKey.findProgramAddress([b,i.toBuffer()],m);if("0"===(await t.getMint(r,s)).supply.toString())return;const a=[{memcmp:{offset:0,bytes:s.toBase58()}},{memcmp:{offset:64,bytes:"2"}},{dataSize:165}],n=await r.getProgramAccounts(t.TOKEN_PROGRAM_ID,{filters:a});if(1!=n.length)return;return new e.PublicKey(n[0].account.data.slice(32,64))}catch{return}};class S{constructor(t){this.parentName=new e.PublicKey(t.parentName),this.owner=new e.PublicKey(t.owner),this.class=new e.PublicKey(t.class)}static async retrieve(e,t){var r;const s=await e.getAccountInfo(t);if(!s)throw new Error("Invalid name account provided");let a=i.deserializeUnchecked(this.schema,S,s.data);a.data=null===(r=s.data)||void 0===r?void 0:r.slice(this.HEADER_LEN);return{registry:a,nftOwner:await h(e,t)}}static async _retrieveBatch(e,t){const r=await e.getMultipleAccountsInfo(t),s=e=>{if(!e)return;const t=i.deserializeUnchecked(this.schema,S,e);return t.data=null==e?void 0:e.slice(this.HEADER_LEN),t};return r.map((e=>s(null==e?void 0:e.data)))}static async retrieveBatch(e,t){let r=[];const i=[...t];for(;i.length>0;)r.push(...await this._retrieveBatch(e,i.splice(0,100)));return r}}S.HEADER_LEN=96,S.schema=new Map([[S,{kind:"struct",fields:[["parentName",[32]],["owner",[32]],["class",[32]]]}]]);class R{constructor(e){this.name=e.name,this.ticker=e.ticker,this.mint=e.mint,this.decimals=e.decimals,this.website=null==e?void 0:e.website,this.logoUri=null==e?void 0:e.logoUri}serialize(){return i.serialize(R.schema,this)}static deserialize(e){return i.deserializeUnchecked(R.schema,R,e)}}R.schema=new Map([[R,{kind:"struct",fields:[["name","string"],["ticker","string"],["mint",[32]],["decimals","u8"],["website",{kind:"option",type:"string"}],["logoUri",{kind:"option",type:"string"}]]}]]);class x{constructor(e){this.mint=e.mint}serialize(){return i.serialize(x.schema,this)}static deserialize(e){return i.deserializeUnchecked(x.schema,x,e)}}x.schema=new Map([[x,{kind:"struct",fields:[["mint",[32]]]}]]);const k=new e.PublicKey("namesLPneVptA9Z5rqUDD9tMTWEJwofgaYwp8cawRkX"),v="SPL Name Service",E=new e.PublicKey("58PwtjSDuFHuUkYjH9BYnnQKHfwo9reZhC2zMJv9JPkx"),B=new e.PublicKey("jCebN34bUfdeUYJT13J1yG16XWQpt5PDx6Mse9GUqhR"),P=new e.PublicKey("ETp9eKXVv1dWwHSpsXRUuXHmw24PwRkttCGVgpZEY9zF"),I=new e.PublicKey("AUoZ3YAhV3b2rZeEH93UMZHXUZcTramBvb4d9YEVySkc"),A=new e.PublicKey("33m47vH6Eav6jr5Ry86XjhRft2jRBLDnDgPSHoquXi2Z"),T=new e.PublicKey("FvPH7PrVrLGKPfqaf3xJodFTjZriqrAXXLTVWEorTFBi"),W=new e.PublicKey("4YcexoW3r78zz16J2aqmukBLRwGq6rAvWzJpkYAXqebv"),K=new e.PublicKey("DmSyHDSM9eSLyvoLsPvDr5fRRFZ7Bfr3h3ULvWpgQaq7"),N=new e.PublicKey("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"),D=[new e.PublicKey("3ogYncmMM5CmytsGCqKHydmXmKUZ6sGWvizkzqwT7zb1"),new e.PublicKey("DM1jJCkZZEwY5tmWbgvKRxsDFzXCdbfrYCCH1CtwguEs")],_=new Map([["EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","USDC"],["Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB","USDT"],["So11111111111111111111111111111111111111112","SOL"],["EchesyfXePKdLtoiZSL8pBe8Myagyy8ZRqsACNCFGnvp","FIDA"],["FeGn77dhg1KXRRFeSwwMiykZnZPw5JXW6naf2aQgZDQf","ETH"],["mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So","MSOL"]]),H=new e.PublicKey("AHtgzX45WTKfkPG53L6WYhGEXwQkN1BVknET3sVsLL8J"),O=new e.PublicKey("GcWEQ9K78FV7LEHteFVciYApERk5YvQuFDQPk1yYJVXi");async function L(e,t){if(!await e.getAccountInfo(t))throw new Error("Unable to find the given account.");return S.retrieve(e,t)}async function C(e){const t=v+e,r=s.sha256(Buffer.from(t,"utf8")).slice(2);return Buffer.from(r,"hex")}async function M(t,r,i){const s=[t];r?s.push(r.toBuffer()):s.push(Buffer.alloc(32)),i?s.push(i.toBuffer()):s.push(Buffer.alloc(32));const[a]=await e.PublicKey.findProgramAddress(s,k);return a}const F=async(e,t=E)=>{let r=await C(e);return{pubkey:await M(r,void 0,t),hashed:r}},z=async(e,t=!1)=>{e.endsWith(".sol")&&(e=e.slice(0,-4));const r=e.split(".");if(2===r.length){const e=Buffer.from([t?1:0]).toString().concat(r[0]),{pubkey:i}=await F(r[1]);return{...await F(e,i),isSub:!0,parent:i}}if(3===r.length&&t){const{pubkey:e}=await F(r[2]),{pubkey:t}=await F("\0".concat(r[1]),e),i=Buffer.from([1]).toString();return{...await F(i.concat(r[0]),t),isSub:!0,parent:e,isSubRecord:!0}}if(r.length>=3)throw new Error("Invalid derivation input");return{...await F(e,E),isSub:!1,parent:void 0}},U=e=>{const t=v+e,r=s.sha256(Buffer.from(t,"utf8")).slice(2);return Buffer.from(r,"hex")},G=(t,r,i)=>{const s=[t];r?s.push(r.toBuffer()):s.push(Buffer.alloc(32)),i?s.push(i.toBuffer()):s.push(Buffer.alloc(32));const[a]=e.PublicKey.findProgramAddressSync(s,k);return a};async function Y(e,t){const i=U(t.toBase58()),s=G(i,A),{registry:a}=await S.retrieve(e,s);if(!a.data)throw new Error("Could not retrieve name data");const n=new r(a.data.slice(0,4),"le").toNumber();return a.data.slice(4,4+n).toString()}const q=(e,t=E)=>{let r=U(e);return{pubkey:G(r,void 0,t),hashed:r}},V=(e,t=!1)=>{e.endsWith(".sol")&&(e=e.slice(0,-4));const r=e.split(".");if(2===r.length){const e=Buffer.from([t?1:0]).toString().concat(r[0]),{pubkey:i}=q(r[1]);return{...q(e,i),isSub:!0,parent:i}}if(3===r.length&&t){const{pubkey:e}=q(r[2]),{pubkey:t}=q("\0".concat(r[1]),e),i=Buffer.from([1]).toString();return{...q(i.concat(r[0]),t),isSub:!0,parent:e,isSubRecord:!0}}if(r.length>=3)throw new Error("Invalid derivation input");return{...q(e,E),isSub:!1,parent:void 0}};async function Z(t,r,i,s,a,n,o,l){const d=await C(r),f=await M(d,o,l),y=n||await t.getMinimumBalanceForRentExemption(i);let w;if(l){const{registry:e}=await L(t,l);w=e.owner}return p(k,e.SystemProgram.programId,f,a,s,d,new u(y),new c(i),o,l,w)}async function j(e,t,r,i,s){const a=await C(t),n=await M(a,i,s);let o;o=i||(await S.retrieve(e,n)).registry.owner;return f(k,n,r,o)}const X=async(t,r,i,s,a)=>{let[n]=await e.PublicKey.findProgramAddress([B.toBuffer()],B),o=await C(t.toBase58()),c=await M(o,n,s);return[[],[new w({name:r}).getInstruction(B,e.SYSVAR_RENT_PUBKEY,k,E,c,n,i,s,a)]]};class J{constructor(e){this.twitterRegistryKey=e.twitterRegistryKey,this.twitterHandle=e.twitterHandle}static async retrieve(e,t){let r=await e.getAccountInfo(t,"processed");if(!r)throw new Error("Invalid reverse Twitter account provided");return i.deserializeUnchecked(this.schema,J,r.data.slice(S.HEADER_LEN))}}async function Q(t,r,s,a,n){const o=await C(a.toString()),d=await M(o,T,W);let f=i.serialize(J.schema,new J({twitterRegistryKey:s.toBytes(),twitterHandle:r}));return[p(k,e.SystemProgram.programId,d,a,n,o,new u(await t.getMinimumBalanceForRentExemption(f.length+S.HEADER_LEN)),new c(f.length),T,W,T),l(k,d,new c(0),Buffer.from(f),T)]}J.schema=new Map([[J,{kind:"struct",fields:[["twitterRegistryKey",[32]],["twitterHandle","string"]]}]]);const $=new e.PublicKey("6NSu2tci4apRKQtt257bAVcvqYjB3zV2H1dWo56vgpa6"),ee=async(e,t)=>{const r=await M(await C(t.toBase58()),void 0,$),{registry:i}=await S.retrieve(e,r);if(!i.data)throw new Error("Invalid account data");return R.deserialize(i.data)};var te;exports.Record=void 0,(te=exports.Record||(exports.Record={})).IPFS="IPFS",te.ARWV="ARWV",te.SOL="SOL",te.ETH="ETH",te.BTC="BTC",te.LTC="LTC",te.DOGE="DOGE",te.Email="email",te.Url="url",te.Discord="discord",te.Github="github",te.Reddit="reddit",te.Twitter="twitter",te.Telegram="telegram",te.Pic="pic",te.SHDW="SHDW",te.POINT="POINT",te.BSC="BSC",te.Injective="INJECT";const re=(e,t)=>{const{pubkey:r}=V(t+"."+e,!0);return r},ie=async(e,t,r)=>{var i,s;const a=re(t,r);let{registry:n}=await S.retrieve(e,a);const o=r===exports.Record.SOL?96:null===(i=n.data)||void 0===i?void 0:i.indexOf(0);return n.data=null===(s=n.data)||void 0===s?void 0:s.slice(0,o),n},se=async(e,t)=>await ie(e,t,exports.Record.SOL),ae=(e,t,r)=>o.sign.detached.verify(e,t,r.toBytes());exports.BONFIDA_FIDA_BNB=I,exports.BONFIDA_USDC_BNB=K,exports.HASH_PREFIX=v,exports.MINT_PREFIX=b,exports.Mint=x,exports.NAME_PROGRAM_ID=k,exports.NAME_TOKENIZER_ID=m,exports.NameRegistryState=S,exports.Numberu32=c,exports.Numberu64=u,exports.PYTH_FIDA_PRICE_ACC=P,exports.PYTH_MAPPING_ACC=H,exports.REFERRERS=D,exports.REGISTER_PROGRAM_ID=B,exports.REVERSE_LOOKUP_CLASS=A,exports.ROOT_DOMAIN_ACCOUNT=E,exports.ReverseTwitterRegistryState=J,exports.SOL_RECORD_SIG_LEN=96,exports.TOKENS_SYM_MINT=_,exports.TOKEN_TLD=$,exports.TWITTER_ROOT_PARENT_REGISTRY_KEY=W,exports.TWITTER_VERIFICATION_AUTHORITY=T,exports.TokenData=R,exports.USDC_MINT=N,exports.VAULT_OWNER=O,exports.changeTwitterRegistryData=async function(e,t,r,i){const s=await C(e),a=await M(s,void 0,W);return[l(k,a,new c(r),i,t)]},exports.changeVerifiedPubkey=async function(e,t,r,i,s){const a=await C(t),n=await M(a,void 0,W);let o=[d(k,n,i,r,void 0)];const c=await C(r.toString());return await M(c,T,void 0),o.push(await j(e,r.toString(),s,T,W)),o=o.concat(await Q(e,t,n,i,s)),o},exports.checkSolRecord=ae,exports.createInstruction=p,exports.createInstructionV3=g,exports.createNameRegistry=Z,exports.createReverseInstruction=w,exports.createReverseName=X,exports.createReverseTwitterRegistry=Q,exports.createSubdomain=async(e,t,r,i=2e3)=>{const s=[],a=t.split(".")[0];if(!a)throw new Error("Invalid subdomain input");const{parent:n,pubkey:o}=V(t),c=await e.getMinimumBalanceForRentExemption(i+S.HEADER_LEN),u=await Z(e,"\0".concat(a),i,r,r,c,void 0,n);s.push(u);const[,p]=await X(o,"\0".concat(a),r,n,r);return s.push(...p),[[],s]},exports.createV2Instruction=y,exports.createVerifiedTwitterRegistry=async function(t,r,i,s,a){const n=await C(r),o=await M(n,void 0,W),l=await t.getMinimumBalanceForRentExemption(s+S.HEADER_LEN);let d=[p(k,e.SystemProgram.programId,o,i,a,n,new u(l),new c(s),void 0,W,T)];return d=d.concat(await Q(t,r,o,i,a)),d},exports.deleteInstruction=f,exports.deleteNameRegistry=j,exports.deleteTwitterRegistry=async function(e,t){const r=await C(e),i=await M(r,void 0,W),s=await C(t.toString()),a=await M(s,T,W);return[f(k,i,t,t),f(k,a,t,t)]},exports.findSubdomains=async(e,t)=>{const r=[{memcmp:{offset:0,bytes:t.toBase58()}},{memcmp:{offset:64,bytes:A.toBase58()}}],i=await e.getProgramAccounts(k,{filters:r}),s=await Y(e,t),a=i.map((e=>{var t;return null===(t=e.account.data.slice(97).toString("utf-8"))||void 0===t?void 0:t.split("\0").join("")})),n=a.map((e=>V(e+"."+s).pubkey)),o=await e.getMultipleAccountsInfo(n);return a.filter(((e,t)=>!!o[t]))},exports.getAllDomains=async function(e,t){const r=[{memcmp:{offset:32,bytes:t.toBase58()}},{memcmp:{offset:0,bytes:E.toBase58()}}];return(await e.getProgramAccounts(k,{filters:r})).map((e=>e.pubkey))},exports.getAllRegisteredDomains=async e=>{const t=[{memcmp:{offset:0,bytes:E.toBase58()}}];return await e.getProgramAccounts(k,{dataSlice:{offset:32,length:32},filters:t})},exports.getArweaveRecord=async(e,t)=>await ie(e,t,exports.Record.ARWV),exports.getBscRecord=async(e,t)=>await ie(e,t,exports.Record.BSC),exports.getBtcRecord=async(e,t)=>await ie(e,t,exports.Record.BTC),exports.getDiscordRecord=async(e,t)=>await ie(e,t,exports.Record.Discord),exports.getDogeRecord=async(e,t)=>await ie(e,t,exports.Record.DOGE),exports.getDomainKey=z,exports.getDomainKeySync=V,exports.getEmailRecord=async(e,t)=>await ie(e,t,exports.Record.Email),exports.getEthRecord=async(e,t)=>await ie(e,t,exports.Record.ETH),exports.getFavoriteDomain=async(t,r)=>{const[i]=await n.FavouriteDomain.getKey(n.NAME_OFFERS_ID,new e.PublicKey(r)),s=await n.FavouriteDomain.retrieve(t,i),a=await Y(t,s.nameAccount);return{domain:s.nameAccount,reverse:a}},exports.getGithubRecord=async(e,t)=>await ie(e,t,exports.Record.Github),exports.getHandleAndRegistryKey=async function(t,r){const i=await C(r.toString()),s=await M(i,T,W);let a=await J.retrieve(t,s);return[a.twitterHandle,new e.PublicKey(a.twitterRegistryKey)]},exports.getHashedName=C,exports.getHashedNameSync=U,exports.getInjectiveRecord=async(e,t)=>await ie(e,t,exports.Record.Injective),exports.getIpfsRecord=async(e,t)=>await ie(e,t,exports.Record.IPFS),exports.getLtcRecord=async(e,t)=>await ie(e,t,exports.Record.LTC),exports.getNameAccountKey=M,exports.getNameAccountKeySync=G,exports.getNameOwner=L,exports.getPicRecord=async(e,t)=>await ie(e,t,exports.Record.Pic),exports.getPointRecord=async(e,t)=>await ie(e,t,exports.Record.POINT),exports.getRecord=ie,exports.getRecordKeySync=re,exports.getRedditRecord=async(e,t)=>await ie(e,t,exports.Record.Reddit),exports.getReverseKey=async(e,t)=>{const{pubkey:r,parent:i}=await z(e),s=await C(r.toBase58());return await M(s,A,t?i:void 0)},exports.getReverseKeySync=(e,t)=>{const{pubkey:r,parent:i}=V(e),s=U(r.toBase58());return G(s,A,t?i:void 0)},exports.getShdwRecord=async(e,t)=>await ie(e,t,exports.Record.SHDW),exports.getSolRecord=se,exports.getTelegramRecord=async(e,t)=>await ie(e,t,exports.Record.Telegram),exports.getTokenInfoFromMint=ee,exports.getTokenInfoFromName=async(t,r)=>{const i=await M(await C(r),void 0,$),{registry:s}=await S.retrieve(t,i);if(!s.data)throw new Error("Invalid account data");const a=new e.PublicKey(x.deserialize(s.data).mint);return await ee(t,a)},exports.getTwitterHandleandRegistryKeyViaFilters=async function(t,r){const s=[{memcmp:{offset:0,bytes:W.toBase58()}},{memcmp:{offset:32,bytes:r.toBase58()}},{memcmp:{offset:64,bytes:T.toBase58()}}],a=await t.getProgramAccounts(k,{filters:s});for(const t of a)if(t.account.data.length>S.HEADER_LEN+32){let r=t.account.data.slice(S.HEADER_LEN),s=i.deserializeUnchecked(J.schema,J,r);return[s.twitterHandle,new e.PublicKey(s.twitterRegistryKey)]}throw new Error("Registry not found.")},exports.getTwitterRecord=async(e,t)=>await ie(e,t,exports.Record.Twitter),exports.getTwitterRegistry=async function(e,t){const r=await C(t),i=await M(r,void 0,W),{registry:s}=await S.retrieve(e,i);return s},exports.getTwitterRegistryData=async function(t,r){const i=[{memcmp:{offset:0,bytes:W.toBase58()}},{memcmp:{offset:32,bytes:r.toBase58()}},{memcmp:{offset:64,bytes:new e.PublicKey(Buffer.alloc(32,0)).toBase58()}}],s=await t.getProgramAccounts(k,{filters:i});if(s.length>1)throw new Error("Found more than one registry.");return s[0].account.data.slice(S.HEADER_LEN)},exports.getTwitterRegistryKey=async function(e){const t=await C(e);return await M(t,void 0,W)},exports.getUrlRecord=async(e,t)=>await ie(e,t,exports.Record.Url),exports.performReverseLookup=async function(e,t){const i=await C(t.toBase58()),s=await M(i,A),{registry:a}=await S.retrieve(e,s);if(!a.data)throw new Error("Could not retrieve name data");const n=new r(a.data.slice(0,4),"le").toNumber();return a.data.slice(4,4+n).toString()},exports.performReverseLookupBatch=async function(e,t){let i=[];for(let e of t){const t=await C(e.toBase58()),r=await M(t,A);i.push(r)}return(await S.retrieveBatch(e,i)).map((e=>{if(void 0===e||void 0===e.data)return;let t=new r(e.data.slice(0,4),"le").toNumber();return e.data.slice(4,4+t).toString()}))},exports.registerDomainName=async(r,i,s,n,o,c=N,u)=>{const[p]=e.PublicKey.findProgramAddressSync([B.toBuffer()],B),l=U(i),d=G(l,void 0,E),f=U(d.toBase58()),y=G(f,p),[w]=e.PublicKey.findProgramAddressSync([d.toBuffer()],B),m=D.findIndex((e=>null==u?void 0:u.equals(e)));let b;const h=[];if(-1!==m&&u){b=t.getAssociatedTokenAddressSync(c,u,!0);const e=await r.getAccountInfo(b);if(!(null==e?void 0:e.data)){const e=t.createAssociatedTokenAccountInstruction(n,b,u,c);h.push(e)}}const S=new a.PythHttpClient(r,a.getPythProgramKeyForCluster("mainnet-beta")),R=await S.getData(),x=_.get(c.toBase58());if(!x)throw new Error("Symbol not found");const v=R.productPrice.get("Crypto."+x+"/USD"),P=R.productFromSymbol.get("Crypto."+x+"/USD"),I=t.getAssociatedTokenAddressSync(c,O),A=new g({name:i,space:s,referrerIdxOpt:-1!=m?m:null}).getInstruction(B,k,E,d,y,e.SystemProgram.programId,p,n,o,H,v.productAccountKey,new e.PublicKey(P.price_account),I,t.TOKEN_PROGRAM_ID,e.SYSVAR_RENT_PUBKEY,w,b);return h.push(A),[[],h]},exports.resolve=async(t,r)=>{const{pubkey:i}=V(r),{registry:s,nftOwner:a}=await S.retrieve(t,i);if(a)return a;try{const i=V(exports.Record.SOL+"."+r,!0),a=await se(t,r);if(!a.data)throw new Error("Invalid SOL record data");const n=new TextEncoder,o=Buffer.concat([a.data.slice(0,32),i.pubkey.toBuffer()]),c=n.encode(o.toString("hex"));if(!ae(c,a.data.slice(32),s.owner))throw new Error("Signature invalid");return new e.PublicKey(a.data.slice(0,32))}catch(e){if(e instanceof Error&&"FetchError"===e.name)throw e;console.log(e)}return s.owner},exports.retrieveNftOwner=h,exports.retrieveNfts=async t=>{const r=await t.getProgramAccounts(m,{filters:[{memcmp:{offset:0,bytes:"3"}}]});return r.map((t=>new e.PublicKey(t.account.data.slice(66,98))))},exports.reverseLookup=Y,exports.reverseLookupBatch=async function(e,t){let i=[];for(let e of t){const t=U(e.toBase58()),r=G(t,A);i.push(r)}return(await S.retrieveBatch(e,i)).map((e=>{if(void 0===e||void 0===e.data)return;let t=new r(e.data.slice(0,4),"le").toNumber();return e.data.slice(4,4+t).toString()}))},exports.transferInstruction=d,exports.transferNameOwnership=async function(e,t,r,i,s,a){const n=await C(t),o=await M(n,i,s);let c;return c=i||(await S.retrieve(e,o)).registry.owner,d(k,o,r,c,i,s,a)},exports.updateInstruction=l,exports.updateNameRegistryData=async function(e,t,r,i,s,a){const n=await C(t),o=await M(n,s,a);let u;return u=s||(await S.retrieve(e,o)).registry.owner,l(k,o,new c(r),i,u)};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bonfida/spl-name-service",
3
- "version": "0.2.1",
3
+ "version": "0.2.3",
4
4
  "license": "MIT",
5
5
  "files": [
6
6
  "dist",
package/src/bindings.ts CHANGED
@@ -34,10 +34,15 @@ import {
34
34
  getPythProgramKeyForCluster,
35
35
  PythHttpClient,
36
36
  } from "@pythnetwork/client";
37
- import { getHashedNameSync, getNameAccountKeySync } from "./utils";
37
+ import {
38
+ getDomainKeySync,
39
+ getHashedNameSync,
40
+ getNameAccountKeySync,
41
+ } from "./utils";
38
42
  import {
39
43
  TOKEN_PROGRAM_ID,
40
44
  getAssociatedTokenAddressSync,
45
+ createAssociatedTokenAccountInstruction,
41
46
  } from "@solana/spl-token";
42
47
 
43
48
  /**
@@ -278,7 +283,24 @@ export const registerDomainName = async (
278
283
  REGISTER_PROGRAM_ID
279
284
  );
280
285
 
281
- const referrerIdx = REFERRERS.findIndex((e) => referrerKey?.equals(e));
286
+ const refIdx = REFERRERS.findIndex((e) => referrerKey?.equals(e));
287
+ let refTokenAccount: PublicKey | undefined = undefined;
288
+
289
+ const ixs: TransactionInstruction[] = [];
290
+
291
+ if (refIdx !== -1 && !!referrerKey) {
292
+ refTokenAccount = getAssociatedTokenAddressSync(mint, referrerKey, true);
293
+ const acc = await connection.getAccountInfo(refTokenAccount);
294
+ if (!acc?.data) {
295
+ const ix = createAssociatedTokenAccountInstruction(
296
+ buyer,
297
+ refTokenAccount,
298
+ referrerKey,
299
+ mint
300
+ );
301
+ ixs.push(ix);
302
+ }
303
+ }
282
304
 
283
305
  const pythConnection = new PythHttpClient(
284
306
  connection,
@@ -300,7 +322,7 @@ export const registerDomainName = async (
300
322
  const ix = new createInstructionV3({
301
323
  name,
302
324
  space,
303
- referrerIdxOpt: referrerIdx != -1 ? referrerIdx : null,
325
+ referrerIdxOpt: refIdx != -1 ? refIdx : null,
304
326
  }).getInstruction(
305
327
  REGISTER_PROGRAM_ID,
306
328
  NAME_PROGRAM_ID,
@@ -318,10 +340,11 @@ export const registerDomainName = async (
318
340
  TOKEN_PROGRAM_ID,
319
341
  SYSVAR_RENT_PUBKEY,
320
342
  derived_state,
321
- referrerKey
343
+ refTokenAccount
322
344
  );
345
+ ixs.push(ix);
323
346
 
324
- return [[], [ix]];
347
+ return [[], ixs];
325
348
  };
326
349
 
327
350
  /**
@@ -370,3 +393,53 @@ export const createReverseName = async (
370
393
 
371
394
  return [[], instructions];
372
395
  };
396
+
397
+ /**
398
+ * This function can be used to create a subdomain
399
+ * @param connection The Solana RPC connection object
400
+ * @param subdomain The subdomain to create with or without .sol e.g something.bonfida.sol or something.bonfida
401
+ * @param owner The owner of the parent domain creating the subdomain
402
+ * @param space The space to allocate to the subdomain (defaults to 2kb)
403
+ */
404
+ export const createSubdomain = async (
405
+ connection: Connection,
406
+ subdomain: string,
407
+ owner: PublicKey,
408
+ space = 2_000
409
+ ) => {
410
+ const ixs: TransactionInstruction[] = [];
411
+ const sub = subdomain.split(".")[0];
412
+ if (!sub) {
413
+ throw new Error("Invalid subdomain input");
414
+ }
415
+
416
+ const { parent, pubkey } = getDomainKeySync(subdomain);
417
+
418
+ // Space allocated to the subdomains
419
+ const lamports = await connection.getMinimumBalanceForRentExemption(
420
+ space + NameRegistryState.HEADER_LEN
421
+ );
422
+
423
+ const ix_create = await createNameRegistry(
424
+ connection,
425
+ "\0".concat(sub),
426
+ space, // Hardcode space to 2kB
427
+ owner,
428
+ owner,
429
+ lamports,
430
+ undefined,
431
+ parent
432
+ );
433
+ ixs.push(ix_create);
434
+
435
+ // Create the reverse name
436
+ const [, ix_reverse] = await createReverseName(
437
+ pubkey,
438
+ "\0".concat(sub),
439
+ owner,
440
+ parent,
441
+ owner
442
+ );
443
+ ixs.push(...ix_reverse);
444
+ return [[], ixs];
445
+ };