UNPKG

@xuxinlai2002/pns-js

Version:

A NPM package in Typescript for .Play Name Service

820 lines (799 loc) 16.2 kB
import { Contract, Wallet, utils, providers } from "ethers"; const rpcUrl = "https://opbnb-mainnet-rpc.bnbchain.org" const priKey = "0xb62774c4d8dbcbe3641e7d78c80fe04899914d531d010f455788b94885f56446" const carvRegistrarControllerAddress = "0x894146F6b8D69dA44D0585FEC1b7560d6F0683F1" const carvRegistrarControllerAbi = [ { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint8", "name": "version", "type": "uint8" } ], "name": "Initialized", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "string", "name": "name", "type": "string" }, { "indexed": true, "internalType": "bytes32", "name": "label", "type": "bytes32" }, { "indexed": true, "internalType": "address", "name": "owner", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "baseCost", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "premium", "type": "uint256" } ], "name": "NameRegistered", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "string", "name": "name", "type": "string" }, { "indexed": true, "internalType": "bytes32", "name": "label", "type": "bytes32" }, { "indexed": false, "internalType": "address", "name": "from", "type": "address" }, { "indexed": false, "internalType": "address", "name": "to", "type": "address" } ], "name": "NameTransfered", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "previousOwner", "type": "address" }, { "indexed": true, "internalType": "address", "name": "newOwner", "type": "address" } ], "name": "OwnershipTransferred", "type": "event" }, { "stateMutability": "payable", "type": "fallback" }, { "inputs": [ { "internalType": "contract BaseRegistrarImplementation", "name": "_base", "type": "address" }, { "internalType": "contract IPriceOracle", "name": "_prices", "type": "address" }, { "internalType": "contract ReverseRegistrar", "name": "_reverseRegistrar", "type": "address" }, { "internalType": "contract ENS", "name": "_ens", "type": "address" } ], "name": "__CarvRegistrarController_init", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "contract ENS", "name": "ens", "type": "address" }, { "internalType": "address", "name": "claimant", "type": "address" } ], "name": "__ReverseClaimer_init", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "string", "name": "name", "type": "string" } ], "name": "available", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "pure", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "owner", "type": "address" } ], "name": "getMainName", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "owner", "type": "address" } ], "name": "getNames", "outputs": [ { "internalType": "string[]", "name": "", "type": "string[]" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "string", "name": "name", "type": "string" } ], "name": "getPrice", "outputs": [ { "components": [ { "internalType": "uint256", "name": "base", "type": "uint256" }, { "internalType": "uint256", "name": "baseUsdt", "type": "uint256" }, { "internalType": "uint256", "name": "premium", "type": "uint256" }, { "internalType": "uint256", "name": "premiumUsdt", "type": "uint256" } ], "internalType": "struct IPriceOracle.Price", "name": "price", "type": "tuple" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getReceiver", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "owner", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "string", "name": "name", "type": "string" }, { "internalType": "address", "name": "owner", "type": "address" }, { "internalType": "uint256", "name": "id", "type": "uint256" }, { "internalType": "string", "name": "uri", "type": "string" }, { "internalType": "address", "name": "resolver", "type": "address" } ], "name": "register", "outputs": [], "stateMutability": "payable", "type": "function" }, { "inputs": [], "name": "renounceOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "string", "name": "name", "type": "string" } ], "name": "setMainName", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "_receiverAddress", "type": "address" } ], "name": "setReceiver", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes4", "name": "interfaceID", "type": "bytes4" } ], "name": "supportsInterface", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "pure", "type": "function" }, { "inputs": [ { "internalType": "string", "name": "name", "type": "string" }, { "internalType": "uint256", "name": "id", "type": "uint256" }, { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "address", "name": "resolver", "type": "address" } ], "name": "transfer", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "newOwner", "type": "address" } ], "name": "transferOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "string", "name": "name", "type": "string" } ], "name": "valid", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "pure", "type": "function" }, { "inputs": [], "name": "withdraw", "outputs": [], "stateMutability": "payable", "type": "function" }, { "stateMutability": "payable", "type": "receive" } ]; const carvPublicResolverAddress = "0x1dABC0a1963F0b0E367EDC1948414bc4B82Df7d1" const carvPublicResolverAbi = [ { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "bytes32", "name": "node", "type": "bytes32" }, { "indexed": false, "internalType": "address", "name": "a", "type": "address" } ], "name": "AddrChanged", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "bytes32", "name": "node", "type": "bytes32" }, { "indexed": false, "internalType": "uint256", "name": "coinType", "type": "uint256" }, { "indexed": false, "internalType": "bytes", "name": "newAddress", "type": "bytes" } ], "name": "AddressChanged", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "owner", "type": "address" }, { "indexed": true, "internalType": "address", "name": "operator", "type": "address" }, { "indexed": false, "internalType": "bool", "name": "approved", "type": "bool" } ], "name": "ApprovalForAll", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "address", "name": "owner", "type": "address" }, { "indexed": true, "internalType": "bytes32", "name": "node", "type": "bytes32" }, { "indexed": true, "internalType": "address", "name": "delegate", "type": "address" }, { "indexed": true, "internalType": "bool", "name": "approved", "type": "bool" } ], "name": "Approved", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "bytes32", "name": "node", "type": "bytes32" }, { "indexed": false, "internalType": "string", "name": "name", "type": "string" } ], "name": "NameChanged", "type": "event" }, { "inputs": [ { "internalType": "contract ENS", "name": "_ens", "type": "address" }, { "internalType": "address", "name": "_trustedETHController", "type": "address" }, { "internalType": "address", "name": "_trustedReverseRegistrar", "type": "address" } ], "name": "__PublicResolver_init", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "contract ENS", "name": "ens", "type": "address" }, { "internalType": "address", "name": "claimant", "type": "address" } ], "name": "__ReverseClaimer_init", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "node", "type": "bytes32" } ], "name": "addr", "outputs": [ { "internalType": "address payable", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "node", "type": "bytes32" }, { "internalType": "uint256", "name": "coinType", "type": "uint256" } ], "name": "addr", "outputs": [ { "internalType": "bytes", "name": "", "type": "bytes" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "node", "type": "bytes32" } ], "name": "name", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "name": "recordVersions", "outputs": [ { "internalType": "uint64", "name": "", "type": "uint64" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "node", "type": "bytes32" }, { "internalType": "uint256", "name": "coinType", "type": "uint256" }, { "internalType": "bytes", "name": "a", "type": "bytes" } ], "name": "setAddr", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "node", "type": "bytes32" }, { "internalType": "address", "name": "a", "type": "address" } ], "name": "setAddr", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "node", "type": "bytes32" }, { "internalType": "string", "name": "newName", "type": "string" } ], "name": "setName", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes4", "name": "interfaceID", "type": "bytes4" } ], "name": "supportsInterface", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" } ] const namehash = require('eth-ens-namehash'); const tld = "play"; const labelhash = (label:string) => utils.keccak256(utils.toUtf8Bytes(label)) function getSubNode(name:string){ let rootNameHash = namehash.hash(tld); let packageHex = rootNameHash + labelhash(name).substring(2) return utils.keccak256(packageHex); } export async function getNames(address: string): Promise<string[]> { const rpc = new providers.JsonRpcProvider(rpcUrl); const wallet = new Wallet( priKey, rpc); const carvRegistrarControllerContract = new Contract(carvRegistrarControllerAddress, carvRegistrarControllerAbi, wallet); const names = await carvRegistrarControllerContract.getNames(address); console.log("xxl names ",names); // names.sort(function(a:string,b:string){ // return a.length>b.length; // }) const retArr = []; for(var i = 0 ;i < names.length ;i ++){ retArr.push(names[i] + "." + tld); } return retArr // return ["abd","efg"] } export async function getAddress(name: string): Promise<string> { const rpc = new providers.JsonRpcProvider(rpcUrl); const wallet = new Wallet( priKey, rpc); const carvPublicResolverContract = new Contract(carvPublicResolverAddress, carvPublicResolverAbi, wallet); let subNodeHash = getSubNode(name); var address = await carvPublicResolverContract.functions["addr(bytes32)"](subNodeHash) if(address.length > 0){ return address[0]; }else{ return ""; } }