@oracle-agent/oracle 0.28.28 → 0.28.30
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.
- package/README.md +10 -3
- package/SETUP.md +3 -0
- package/dist/assets/skills/bankrbot/SKILL.md +24 -0
- package/dist/assets/skills/oracle-agentic-crypto/SKILL.md +39 -0
- package/dist/assets/skills/oracle-desk-product/SKILL.md +1 -1
- package/dist/assets/skills/oracle-uniswap-v4-hooks/SKILL.md +31 -0
- package/dist/assets/skills/oracle-x402/SKILL.md +30 -0
- package/dist/bin/desk-server.mjs +28 -26
- package/dist/bin/oracle-data-mcp.mjs +26 -12
- package/dist/bin/oracle-gateway.mjs +39 -27
- package/dist/bin/oracle-mev-arb-shadow.mjs +5 -5
- package/dist/bin/oracle-mev-shadow.mjs +5 -5
- package/dist/bin/oracle-public-server.mjs +4 -4
- package/dist/bin/oracle-route.mjs +15 -15
- package/dist/bin/oracle-scan.mjs +11 -11
- package/dist/bin/oracle.mjs +4 -3
- package/dist/cli/commands/auth.mjs +6 -6
- package/dist/cli/commands/chat.mjs +161 -161
- package/dist/cli/commands/doctor.mjs +1 -1
- package/dist/cli/commands/eval.mjs +138 -139
- package/dist/cli/commands/farm.mjs +22 -22
- package/dist/cli/commands/follow.mjs +14 -14
- package/dist/cli/commands/harness.mjs +4 -4
- package/dist/cli/commands/model.mjs +163 -163
- package/dist/cli/commands/receipt.mjs +1 -1
- package/dist/cli/commands/resolve.mjs +6 -6
- package/dist/cli/commands/setup.mjs +23 -23
- package/dist/cli/commands/snipe.mjs +24 -0
- package/dist/cli/commands/strategy.mjs +3 -3
- package/dist/cli/commands/swap.mjs +25 -25
- package/dist/cli/commands/venues.mjs +1 -1
- package/dist/control/approval-binding.mjs +1 -0
- package/dist/control/finality.mjs +1 -0
- package/dist/control-plane/index.mjs +6 -0
- package/dist/data/desk-data.mjs +27 -25
- package/dist/data/names.mjs +2 -2
- package/dist/data/providers/farming.mjs +2 -2
- package/dist/governance-prepare.mjs +2 -0
- package/dist/index.mjs +44 -31
- package/dist/local-marketplace.mjs +3 -0
- package/dist/local-pack-registry.mjs +3 -0
- package/dist/local-signer/runtime.mjs +7 -7
- package/dist/local-x402.mjs +3 -0
- package/dist/nft/universal-mint-router.mjs +3 -3
- package/dist/notifications/index.mjs +3 -0
- package/dist/position-health.mjs +2 -0
- package/dist/router/index.mjs +2 -2
- package/dist/router/prepare-bridge.mjs +2 -2
- package/dist/safety-intelligence.mjs +1 -0
- package/dist/scanner/index.mjs +3 -3
- package/dist/strategy/index.mjs +3 -3
- package/dist/task.d.mts +130 -0
- package/dist/task.mjs +2 -0
- package/dist/tax-lots.mjs +5 -0
- package/dist/tenant-rbac.mjs +1 -0
- package/dist/workflow-telemetry.mjs +1 -0
- package/package.json +17 -2
- package/public/agent-connect/index.html +2 -2
- package/public/install.sh +2 -2
- package/public/oracle-splash/index.html +2 -2
- package/public/oracle-splash/install.sh +2 -2
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var x={robinhood:{chainId:4663,name:"Robinhood Chain",rpcEnv:["RH_CHAIN_RPC"],evm:!0},ethereum:{chainId:1,name:"Ethereum",rpcEnv:["ETH_RPC_URL","ETHEREUM_RPC_URL","MAINNET_RPC_URL"],evm:!0},polygon:{chainId:137,name:"Polygon",rpcEnv:["POLYGON_RPC_URL","POLYGON_RPC"],evm:!0},arbitrum:{chainId:42161,name:"Arbitrum One",rpcEnv:["ARBITRUM_RPC_URL","ARB_RPC_URL"],evm:!0},base:{chainId:8453,name:"Base",rpcEnv:["BASE_RPC_URL"],evm:!0},hyperevm:{chainId:999,name:"HyperEVM",rpcEnv:["HYPEREVM_RPC_URL","HYPER_EVM_RPC"],evm:!0},bsc:{chainId:56,name:"BNB Smart Chain",rpcEnv:["BSC_RPC_URL","BNB_RPC_URL"],evm:!0},avalanche:{chainId:43114,name:"Avalanche C-Chain",rpcEnv:["AVALANCHE_RPC_URL","AVAX_RPC_URL"],evm:!0},optimism:{chainId:10,name:"OP Mainnet",rpcEnv:["OPTIMISM_RPC_URL","OP_RPC_URL"],evm:!0},abstract:{chainId:2741,name:"Abstract",rpcEnv:["ABSTRACT_RPC_URL","ABS_RPC_URL"],evm:!0},stable:{chainId:988,name:"Stable Mainnet",rpcEnv:["STABLE_RPC_URL","STABLE_RPC"],evm:!0}},ne=new Map(Object.values(x).map(t=>[t.chainId,t]));function l(t){let o=t?.transactionHash||t?.hash||t?.txid||null;return o?{happened:!0,hash:String(o),note:null}:{happened:!1,hash:null,note:"no transaction hash \u2014 the action did not succeed"}}import{Interface as E,keccak256 as yo}from"ethers";import{Transaction as bo}from"@scure/btc-signer";import{ed25519 as So}from"@noble/curves/ed25519.js";import{base58 as zr}from"@scure/base";import{Interface as T}from"ethers";import{Interface as $,MaxUint256 as qe,isAddress as De,keccak256 as Ue,toUtf8Bytes as je}from"ethers";import{Interface as _,isAddress as be}from"ethers";import{isAddress as me}from"ethers";var ve=new _(["function approve(address spender,uint256 amount) returns (bool)"]);import{Interface as B,isAddress as Te}from"ethers";var Ce=new B(["function approve(address spender,uint256 amount) returns (bool)"]),Re=Object.freeze({42161:"0x1c3fa76e6e1088bce750f23a5bfcffa1efef6a41",43114:"0x8f550e53dfe96c055d5bdb267c21f268fcaf63b2"});var Ve=new $(["function approve(address spender,uint256 amount) returns (bool)"]);var Ye=300*1e3,Xe=(()=>{let t=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(t)&&t>0?t:1800*1e3})();import{Address as rt,NETWORK as nt,OutScript as ot,RawTx as it,SigHash as at,TEST_NETWORK as st,Transaction as ct}from"@scure/btc-signer";import{createHash as M}from"node:crypto";import{base58 as ft}from"@scure/base";import{getCompiledTransactionMessageDecoder as mt}from"@solana/transaction-messages";var S=t=>M("sha256").update(`global:${t}`).digest().subarray(0,8).toString("hex"),ht=new Map([[S("route"),{name:"route",prefixBytes:0}],[S("shared_accounts_route"),{name:"shared_accounts_route",prefixBytes:1}]]);var At=64*1024;var Bt=Object.freeze({"perp-order":"order","hip3-order":"order","hip4-order":"order","perp-bracket":"order","perp-cancel":"cancel","perp-leverage":"leverage","perp-isolated-margin":"margin","builder-fee-approval":"approveBuilder","hype-stake-deposit":"stake","hype-stake-withdraw":"unstake","hype-delegate":"delegate","hype-undelegate":"delegate"}),$t=Object.freeze({"perp-order":"order","hip3-order":"order","hip4-order":"order","perp-bracket":"order","perp-cancel":"cancel","perp-leverage":"updateLeverage","perp-isolated-margin":"updateIsolatedMargin","builder-fee-approval":"approveBuilderFee","hype-stake-deposit":"cDeposit","hype-stake-withdraw":"cWithdraw","hype-delegate":"tokenDelegate","hype-undelegate":"tokenDelegate"});var qt="0x"+"00".repeat(32);var q=Object.freeze([["salt","uint256"],["maker","address"],["signer","address"],["tokenId","uint256"],["makerAmount","uint256"],["takerAmount","uint256"],["side","uint8"],["signatureType","uint8"],["timestamp","uint256"],["metadata","bytes32"],["builder","bytes32"]]),Ht=Object.freeze(q.map(t=>t[0]));var H=new Set(["evm","evm-swap","evm-bridge","evm-nft","btc","sol","hl","poly","lighter"]);var cr=Object.freeze({swap:5,bridge:5,perps:0,nft:0,mint:0,transfer:0,approve:0,order:0,cancel:0,leverage:0,margin:0,approveBuilder:0,stake:0,unstake:0,delegate:0});var J=Object.freeze({"0x04e45aaf":{provider:"uniswap-v3",action:"swap",layout:"router02-exact-input-single"},"0x414bf389":{provider:"uniswap-v3",action:"swap",layout:"swap-router-exact-input-single"},"0xc04b8d59":{provider:"uniswap-v3",action:"swap",layout:"exact-input-deadline"},"0xb858183f":{provider:"uniswap-v3",action:"swap",layout:"exact-input"},"0x5ae401dc":{provider:"uniswap-v3",action:"swap",layout:"multicall-deadline"},"0xa026383e":{provider:"aerodrome",action:"swap",layout:"aerodrome-exact-input-single"},"0x7b939232":{provider:"across-v3",action:"bridge",layout:"across-deposit-v3"}}),ur=Object.freeze({"0x161ac21f":{provider:"opensea-nft",action:"mint",layout:"seadrop-mint-public"},"0xc2f6663a":{provider:"opensea-nft",action:"mint",layout:"seadrop-mint-allowlist"}}),lr=new T(["function buySpecificNFT(uint256 tokenId,uint256 maxCost) payable","function sellNFT(uint256 tokenId,uint256 minPayout) payable"]),dr=new T(["function mintAllowList(address nftContract,address feeRecipient,address minterIfNotPayer,uint256 quantity,(uint80 mintPrice,uint48 maxTotalMintableByWallet,uint48 startTime,uint48 endTime,uint48 dropStageIndex,uint32 maxTokenSupplyForStage,uint16 feeBps,bool restrictFeeRecipients) mintParams,bytes32[] proof) payable"]),fr=Object.freeze({"0xa0712d68":{provider:"nft-mint",action:"mint",layout:"mint-quantity"},"0x1249c58b":{provider:"nft-mint",action:"mint",layout:"mint-no-args"},"0x2db11544":{provider:"nft-mint",action:"mint",layout:"mint-quantity"},"0xefef39a1":{provider:"nft-mint",action:"mint",layout:"mint-quantity"},"0xa6f2ae3a":{provider:"nft-mint",action:"mint",layout:"mint-no-args"}});var z=Object.freeze([...H]),pr=Object.freeze({...J});import{ed25519 as Or}from"@noble/curves/ed25519.js";import{base58 as Cr}from"@scure/base";import{RawTx as Pr,SigHash as _r,Transaction as Br}from"@scure/btc-signer";import{Transaction as Fr,keccak256 as Mr,verifyTypedData as qr}from"ethers";import{encode as wr}from"@msgpack/msgpack";import{keccak256 as yr,verifyTypedData as Er}from"ethers";var br=Object.freeze({name:"Exchange",version:"1",chainId:1337,verifyingContract:"0x0000000000000000000000000000000000000000"}),xr=Object.freeze({Agent:[{name:"source",type:"string"},{name:"connectionId",type:"bytes32"}]});var on=Object.freeze({N:1<<17,r:8,p:1}),an=256*1024*1024,sn=16*1024;var un=Object.freeze({1:{name:"ethereum",mode:"mempool-private",endpoints:["https://rpc.flashbots.net/fast","https://rpc.mevblocker.io"]},8453:{name:"base",mode:"sequencer",endpoints:["https://mainnet-sequencer.base.org"]},10:{name:"optimism",mode:"sequencer",endpoints:["https://mainnet-sequencer.optimism.io"]},42161:{name:"arbitrum",mode:"sequencer",endpoints:["https://arb1-sequencer.arbitrum.io/rpc"]},56:{name:"bsc",mode:"mempool-private",endpoints:["https://rpc.48.club","https://bsc.rpc.blxrbdn.com"]},137:{name:"polygon",mode:"mempool-private",endpoints:["https://polygon-bor-rpc.publicnode.com"]},43114:{name:"avalanche",mode:"public-only",endpoints:[]},999:{name:"hyperevm",mode:"public-only",endpoints:[]}});import{homedir as g}from"node:os";import{join as y}from"node:path";var O=process.env.ORACLE_PUBLIC_DESKTOP==="1",K=O?process.env.ORACLE_CONFIG_DIR||y(g(),".config","oracle"):y(g(),".config","oracle"),pn=O?K:y(g(),".config","mad-desk");var yn="0".repeat(64),En=Object.freeze({PREPARE:"exec.prepare",SIGN:"exec.sign",BROADCAST:"exec.broadcast",POLICY_REJECT:"policy.reject",AUTH_GRANT:"auth.grant",AUTH_OK:"auth.verify.ok",AUTH_FAIL:"auth.verify.fail"});var bn=Promise.resolve();import{Wallet as Ln}from"ethers";import{base58 as Rn}from"@scure/base";import{ed25519 as _n}from"@noble/curves/ed25519.js";import{NETWORK as $n,TEST_NETWORK as Fn,WIF as Mn,p2wpkh as qn}from"@scure/btc-signer";import{pubECDSA as Un}from"@scure/btc-signer/utils.js";var Ho=new E(["function collection() view returns (address)","function token() view returns (address)","function robinhoodSwapFeeWei() view returns (uint256)","function quoteSpecificBuy(uint256 tokenId) view returns (uint256 totalCost,uint256 baseCost,uint256 fee,uint256 protocolFee,bool available)","function quoteSellNFT() view returns (uint256 netPayout,uint256 grossPayout,uint256 fee,uint256 protocolFee)","function inventory(uint256 tokenId) view returns (bool)","function buySpecificNFT(uint256 tokenId,uint256 maxCost) payable","function sellNFT(uint256 tokenId,uint256 minPayout) payable"]),Jo=new E(["function decimals() view returns (uint8)","function allowance(address owner,address spender) view returns (uint256)"]),zo=new E(["function ownerOf(uint256 tokenId) view returns (address)","function getApproved(uint256 tokenId) view returns (address)","function isApprovedForAll(address owner,address operator) view returns (bool)"]);var ti=Object.freeze([{type:"function",function:{name:"vault_status",description:"Read local Oracle vault/signer readiness. Never returns key material.",parameters:{type:"object",properties:{},additionalProperties:!1}}},{type:"function",function:{name:"signer_status",description:"Ping the loopback signer. Fails closed if it is not running.",parameters:{type:"object",properties:{},additionalProperties:!1}}},{type:"function",function:{name:"signer_execute",description:"Broadcast one already-confirmed local artifact. Requires a one-use confirmationNonce from the local signer TTY confirm. Cannot mint confirmation itself.",parameters:{type:"object",properties:{artifact:{type:"object"},confirmationNonce:{type:"string",minLength:32,maxLength:128}},required:["artifact","confirmationNonce"],additionalProperties:!1}}},{type:"function",function:{name:"signer_disarm",description:"Global kill switch. Stops the local signer from broadcasting.",parameters:{type:"object",properties:{},additionalProperties:!1}}},{type:"function",function:{name:"receipt_report",description:"Receipt or it did not happen. Requires transactionHash/hash/txid.",parameters:{type:"object",properties:{receipt:{type:"object"},transactionHash:{type:"string"},hash:{type:"string"},txid:{type:"string"}},additionalProperties:!1}}},{type:"function",function:{name:"watch_create",description:"Create an alert-only watch. Never execute.",parameters:{type:"object",properties:{chain:{type:"string"},token:{type:"string"},condition:{type:"string"},note:{type:"string"}},required:["chain","token","condition"],additionalProperties:!1}}},{type:"function",function:{name:"watch_list",description:"List local alert-only watches.",parameters:{type:"object",properties:{},additionalProperties:!1}}},{type:"function",function:{name:"portfolio_snapshot",description:"How to read the one portfolio snapshot. knownUsd is incomplete if a provider is missing.",parameters:{type:"object",properties:{},additionalProperties:!1}}}]);import f from"node:fs";import X from"node:os";import u from"node:path";import{fileURLToPath as Q}from"node:url";var Z=u.dirname(Q(import.meta.url)),si=u.resolve(Z,"../..");function C(){return process.env.ORACLE_FAKE_HOME||X.homedir()}function ee(){return process.env.ORACLE_PUBLIC_DESKTOP==="1"}function b(){return ee()?process.env.ORACLE_CONFIG_DIR||u.join(C(),".config","oracle"):u.join(C(),".config","oracle")}function te(){return u.join(b(),"desk.json")}function re(){return u.join(b(),"env")}function c({force:t=!1}={}){if(c._done&&!t)return c._result||null;c._done=!0;let o={},r=(n,e)=>{if(e==null)return;let i=String(e).trim();i&&(process.env[n]!=null&&String(process.env[n]).trim()!==""||(process.env[n]=i,o[n]=i))};try{let n=re();if(f.existsSync(n))for(let e of f.readFileSync(n,"utf8").split(/\r?\n/)){let i=e.match(/^\s*([A-Z0-9_]+)\s*=\s*(.*?)\s*$/);if(!i||i[2].startsWith("#"))continue;let s=i[2];(s.startsWith('"')&&s.endsWith('"')||s.startsWith("'")&&s.endsWith("'"))&&(s=s.slice(1,-1)),r(i[1],s)}}catch{}try{let n=te();if(f.existsSync(n)){let e=JSON.parse(f.readFileSync(n,"utf8"));e&&typeof e=="object"&&(r("ORACLE_DESK_URL",e.deskUrl||e.dataUrl||e.url),r("ORACLE_DATA_URL",e.dataUrl||e.deskUrl||e.url),r("ORACLE_API_URL",e.apiUrl||e.dataUrl||e.deskUrl),r("ORACLE_PUBLIC_URL",e.publicUrl||e.deskUrl||e.dataUrl),r("ORACLE_EXEC_URL",e.execUrl),r("MAD_DESK_URL",e.deskUrl||e.dataUrl))}}catch{}let a=process.env.ORACLE_DESK_URL||process.env.ORACLE_DATA_URL||"";return a&&(r("ORACLE_DESK_URL",a),r("ORACLE_DATA_URL",a),r("ORACLE_API_URL",a),r("ORACLE_PUBLIC_URL",a),r("MAD_DESK_URL",a)),c._result=Object.keys(o).length?o:null,c._result}try{c()}catch{}var Ai={name:"receipt",summary:"say whether an on-chain action happened (hash or it did not)",group:"read",usage:"oracle receipt --hash <txid> | oracle receipt --json '<receipt>'",async run(t){let o=t.argv||[],r={},a=o.indexOf("--hash"),n=o.indexOf("--json");if(a>=0)r={transactionHash:o[a+1]};else if(n>=0)try{r=JSON.parse(o[n+1]||"{}")}catch(i){return process.stderr.write(`receipt: bad json: ${i.message}
|
|
1
|
+
var x={robinhood:{chainId:4663,name:"Robinhood Chain",rpcEnv:["RH_CHAIN_RPC"],evm:!0},ethereum:{chainId:1,name:"Ethereum",rpcEnv:["ETH_RPC_URL","ETHEREUM_RPC_URL","MAINNET_RPC_URL"],evm:!0},polygon:{chainId:137,name:"Polygon",rpcEnv:["POLYGON_RPC_URL","POLYGON_RPC"],evm:!0},arbitrum:{chainId:42161,name:"Arbitrum One",rpcEnv:["ARBITRUM_RPC_URL","ARB_RPC_URL"],evm:!0},base:{chainId:8453,name:"Base",rpcEnv:["BASE_RPC_URL"],evm:!0},hyperevm:{chainId:999,name:"HyperEVM",rpcEnv:["HYPEREVM_RPC_URL","HYPER_EVM_RPC"],evm:!0},bsc:{chainId:56,name:"BNB Smart Chain",rpcEnv:["BSC_RPC_URL","BNB_RPC_URL"],evm:!0},avalanche:{chainId:43114,name:"Avalanche C-Chain",rpcEnv:["AVALANCHE_RPC_URL","AVAX_RPC_URL"],evm:!0},optimism:{chainId:10,name:"OP Mainnet",rpcEnv:["OPTIMISM_RPC_URL","OP_RPC_URL"],evm:!0},abstract:{chainId:2741,name:"Abstract",rpcEnv:["ABSTRACT_RPC_URL","ABS_RPC_URL"],evm:!0},stable:{chainId:988,name:"Stable Mainnet",rpcEnv:["STABLE_RPC_URL","STABLE_RPC"],evm:!0}},ne=new Map(Object.values(x).map(t=>[t.chainId,t]));function l(t){let o=t?.transactionHash||t?.hash||t?.txid||null;return o?{happened:!0,hash:String(o),note:null}:{happened:!1,hash:null,note:"no transaction hash \u2014 the action did not succeed"}}import{Interface as E,keccak256 as yo}from"ethers";import{Transaction as bo}from"@scure/btc-signer";import{ed25519 as So}from"@noble/curves/ed25519.js";import{base58 as zr}from"@scure/base";import{Interface as T}from"ethers";import{Interface as $,MaxUint256 as Me,isAddress as De,keccak256 as Ue,toUtf8Bytes as je}from"ethers";import{Interface as _,isAddress as be}from"ethers";import{isAddress as me}from"ethers";var ve=new _(["function approve(address spender,uint256 amount) returns (bool)"]);import{Interface as B,isAddress as Te}from"ethers";var Ce=new B(["function approve(address spender,uint256 amount) returns (bool)"]),Re=Object.freeze({42161:"0x1c3fa76e6e1088bce750f23a5bfcffa1efef6a41",43114:"0x8f550e53dfe96c055d5bdb267c21f268fcaf63b2"});var Ve=new $(["function approve(address spender,uint256 amount) returns (bool)"]);var Ye=300*1e3,Xe=(()=>{let t=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(t)&&t>0?t:1800*1e3})();import{Address as rt,NETWORK as nt,OutScript as ot,RawTx as it,SigHash as at,TEST_NETWORK as st,Transaction as ct}from"@scure/btc-signer";import{createHash as q}from"node:crypto";import{base58 as ft}from"@scure/base";import{getCompiledTransactionMessageDecoder as mt}from"@solana/transaction-messages";var S=t=>q("sha256").update(`global:${t}`).digest().subarray(0,8).toString("hex"),ht=new Map([[S("route"),{name:"route",prefixBytes:0}],[S("shared_accounts_route"),{name:"shared_accounts_route",prefixBytes:1}]]);var At=64*1024;var Bt=Object.freeze({"perp-order":"order","hip3-order":"order","hip4-order":"order","perp-bracket":"order","perp-cancel":"cancel","perp-leverage":"leverage","perp-isolated-margin":"margin","builder-fee-approval":"approveBuilder","hype-stake-deposit":"stake","hype-stake-withdraw":"unstake","hype-delegate":"delegate","hype-undelegate":"delegate"}),$t=Object.freeze({"perp-order":"order","hip3-order":"order","hip4-order":"order","perp-bracket":"order","perp-cancel":"cancel","perp-leverage":"updateLeverage","perp-isolated-margin":"updateIsolatedMargin","builder-fee-approval":"approveBuilderFee","hype-stake-deposit":"cDeposit","hype-stake-withdraw":"cWithdraw","hype-delegate":"tokenDelegate","hype-undelegate":"tokenDelegate"});var Mt="0x"+"00".repeat(32);var M=Object.freeze([["salt","uint256"],["maker","address"],["signer","address"],["tokenId","uint256"],["makerAmount","uint256"],["takerAmount","uint256"],["side","uint8"],["signatureType","uint8"],["timestamp","uint256"],["metadata","bytes32"],["builder","bytes32"]]),Ht=Object.freeze(M.map(t=>t[0]));var H=new Set(["evm","evm-swap","evm-bridge","evm-nft","btc","sol","hl","poly","lighter"]);var cr=Object.freeze({swap:5,bridge:5,perps:0,nft:0,mint:0,transfer:0,approve:0,order:0,cancel:0,leverage:0,margin:0,approveBuilder:0,stake:0,unstake:0,delegate:0});var J=Object.freeze({"0x04e45aaf":{provider:"uniswap-v3",action:"swap",layout:"router02-exact-input-single"},"0x414bf389":{provider:"uniswap-v3",action:"swap",layout:"swap-router-exact-input-single"},"0xc04b8d59":{provider:"uniswap-v3",action:"swap",layout:"exact-input-deadline"},"0xb858183f":{provider:"uniswap-v3",action:"swap",layout:"exact-input"},"0x5ae401dc":{provider:"uniswap-v3",action:"swap",layout:"multicall-deadline"},"0xa026383e":{provider:"aerodrome",action:"swap",layout:"aerodrome-exact-input-single"},"0x7b939232":{provider:"across-v3",action:"bridge",layout:"across-deposit-v3"}}),ur=Object.freeze({"0x161ac21f":{provider:"opensea-nft",action:"mint",layout:"seadrop-mint-public"},"0xc2f6663a":{provider:"opensea-nft",action:"mint",layout:"seadrop-mint-allowlist"}}),lr=new T(["function buySpecificNFT(uint256 tokenId,uint256 maxCost) payable","function sellNFT(uint256 tokenId,uint256 minPayout) payable"]),dr=new T(["function mintAllowList(address nftContract,address feeRecipient,address minterIfNotPayer,uint256 quantity,(uint80 mintPrice,uint48 maxTotalMintableByWallet,uint48 startTime,uint48 endTime,uint48 dropStageIndex,uint32 maxTokenSupplyForStage,uint16 feeBps,bool restrictFeeRecipients) mintParams,bytes32[] proof) payable"]),fr=Object.freeze({"0xa0712d68":{provider:"nft-mint",action:"mint",layout:"mint-quantity"},"0x1249c58b":{provider:"nft-mint",action:"mint",layout:"mint-no-args"},"0x2db11544":{provider:"nft-mint",action:"mint",layout:"mint-quantity"},"0xefef39a1":{provider:"nft-mint",action:"mint",layout:"mint-quantity"},"0xa6f2ae3a":{provider:"nft-mint",action:"mint",layout:"mint-no-args"}});var z=Object.freeze([...H]),pr=Object.freeze({...J});import{ed25519 as Or}from"@noble/curves/ed25519.js";import{base58 as Cr}from"@scure/base";import{RawTx as Pr,SigHash as _r,Transaction as Br}from"@scure/btc-signer";import{Transaction as Fr,keccak256 as qr,verifyTypedData as Mr}from"ethers";import{encode as wr}from"@msgpack/msgpack";import{keccak256 as yr,verifyTypedData as Er}from"ethers";var br=Object.freeze({name:"Exchange",version:"1",chainId:1337,verifyingContract:"0x0000000000000000000000000000000000000000"}),xr=Object.freeze({Agent:[{name:"source",type:"string"},{name:"connectionId",type:"bytes32"}]});var on=Object.freeze({N:1<<17,r:8,p:1}),an=256*1024*1024,sn=16*1024;var un=Object.freeze({1:{name:"ethereum",mode:"mempool-private",endpoints:["https://rpc.flashbots.net/fast","https://rpc.mevblocker.io"]},8453:{name:"base",mode:"sequencer",endpoints:["https://mainnet-sequencer.base.org"]},10:{name:"optimism",mode:"sequencer",endpoints:["https://mainnet-sequencer.optimism.io"]},42161:{name:"arbitrum",mode:"sequencer",endpoints:["https://arb1-sequencer.arbitrum.io/rpc"]},56:{name:"bsc",mode:"mempool-private",endpoints:["https://rpc.48.club","https://bsc.rpc.blxrbdn.com"]},137:{name:"polygon",mode:"mempool-private",endpoints:["https://polygon-bor-rpc.publicnode.com"]},43114:{name:"avalanche",mode:"public-only",endpoints:[]},999:{name:"hyperevm",mode:"public-only",endpoints:[]}});import{homedir as g}from"node:os";import{join as y}from"node:path";var O=process.env.ORACLE_PUBLIC_DESKTOP==="1",K=O?process.env.ORACLE_CONFIG_DIR||y(g(),".config","oracle"):y(g(),".config","oracle"),pn=O?K:y(g(),".config","mad-desk");var yn="0".repeat(64),En=Object.freeze({PREPARE:"exec.prepare",SIGN:"exec.sign",BROADCAST:"exec.broadcast",POLICY_REJECT:"policy.reject",AUTH_GRANT:"auth.grant",AUTH_OK:"auth.verify.ok",AUTH_FAIL:"auth.verify.fail"});var bn=Promise.resolve();import{Wallet as Ln}from"ethers";import{base58 as Rn}from"@scure/base";import{ed25519 as _n}from"@noble/curves/ed25519.js";import{NETWORK as $n,TEST_NETWORK as Fn,WIF as qn,p2wpkh as Mn}from"@scure/btc-signer";import{pubECDSA as Un}from"@scure/btc-signer/utils.js";var Ho=new E(["function collection() view returns (address)","function token() view returns (address)","function robinhoodSwapFeeWei() view returns (uint256)","function quoteSpecificBuy(uint256 tokenId) view returns (uint256 totalCost,uint256 baseCost,uint256 fee,uint256 protocolFee,bool available)","function quoteSellNFT() view returns (uint256 netPayout,uint256 grossPayout,uint256 fee,uint256 protocolFee)","function inventory(uint256 tokenId) view returns (bool)","function buySpecificNFT(uint256 tokenId,uint256 maxCost) payable","function sellNFT(uint256 tokenId,uint256 minPayout) payable"]),Jo=new E(["function decimals() view returns (uint8)","function allowance(address owner,address spender) view returns (uint256)"]),zo=new E(["function ownerOf(uint256 tokenId) view returns (address)","function getApproved(uint256 tokenId) view returns (address)","function isApprovedForAll(address owner,address operator) view returns (bool)"]);var ti=Object.freeze([{type:"function",function:{name:"vault_status",description:"Read local Oracle vault/signer readiness. Never returns key material.",parameters:{type:"object",properties:{},additionalProperties:!1}}},{type:"function",function:{name:"signer_status",description:"Ping the loopback signer. Fails closed if it is not running.",parameters:{type:"object",properties:{},additionalProperties:!1}}},{type:"function",function:{name:"signer_pending",description:"List pending local-signer artifacts. Read-only. Does not approve, sign, or broadcast.",parameters:{type:"object",properties:{},additionalProperties:!1}}},{type:"function",function:{name:"signer_queue",description:"Queue a prepared unsigned artifact on the loopback signer. Does not broadcast.",parameters:{type:"object",properties:{artifact:{type:"object"}},required:["artifact"],additionalProperties:!1}}},{type:"function",function:{name:"signer_ack",description:"Execute one pending artifact through the armed local signer (same path as Telegram Allow). Fails if the signer is not running or disarmed. Never holds keys.",parameters:{type:"object",properties:{id:{type:"string"},digest:{type:"string"}},additionalProperties:!1}}},{type:"function",function:{name:"signer_deny",description:"Drop one pending local-signer artifact. Nothing signed.",parameters:{type:"object",properties:{id:{type:"string"},digest:{type:"string"}},additionalProperties:!1}}},{type:"function",function:{name:"signer_execute",description:"Broadcast one already-confirmed local artifact. Requires a one-use confirmationNonce from the local signer TTY confirm. Cannot mint confirmation itself.",parameters:{type:"object",properties:{artifact:{type:"object"},confirmationNonce:{type:"string",minLength:32,maxLength:128}},required:["artifact","confirmationNonce"],additionalProperties:!1}}},{type:"function",function:{name:"signer_disarm",description:"Global kill switch. Stops the local signer from broadcasting.",parameters:{type:"object",properties:{},additionalProperties:!1}}},{type:"function",function:{name:"receipt_report",description:"Receipt or it did not happen. Requires transactionHash/hash/txid.",parameters:{type:"object",properties:{receipt:{type:"object"},transactionHash:{type:"string"},hash:{type:"string"},txid:{type:"string"}},additionalProperties:!1}}},{type:"function",function:{name:"watch_create",description:"Create an alert-only watch. Never execute.",parameters:{type:"object",properties:{chain:{type:"string"},token:{type:"string"},condition:{type:"string"},note:{type:"string"}},required:["chain","token","condition"],additionalProperties:!1}}},{type:"function",function:{name:"watch_list",description:"List local alert-only watches.",parameters:{type:"object",properties:{},additionalProperties:!1}}},{type:"function",function:{name:"portfolio_snapshot",description:"How to read the one portfolio snapshot. knownUsd is incomplete if a provider is missing.",parameters:{type:"object",properties:{},additionalProperties:!1}}}]);import f from"node:fs";import X from"node:os";import u from"node:path";import{fileURLToPath as Q}from"node:url";var Z=u.dirname(Q(import.meta.url)),si=u.resolve(Z,"../..");function C(){return process.env.ORACLE_FAKE_HOME||X.homedir()}function ee(){return process.env.ORACLE_PUBLIC_DESKTOP==="1"}function b(){return ee()?process.env.ORACLE_CONFIG_DIR||u.join(C(),".config","oracle"):u.join(C(),".config","oracle")}function te(){return u.join(b(),"desk.json")}function re(){return u.join(b(),"env")}function c({force:t=!1}={}){if(c._done&&!t)return c._result||null;c._done=!0;let o={},r=(n,e)=>{if(e==null)return;let i=String(e).trim();i&&(process.env[n]!=null&&String(process.env[n]).trim()!==""||(process.env[n]=i,o[n]=i))};try{let n=re();if(f.existsSync(n))for(let e of f.readFileSync(n,"utf8").split(/\r?\n/)){let i=e.match(/^\s*([A-Z0-9_]+)\s*=\s*(.*?)\s*$/);if(!i||i[2].startsWith("#"))continue;let s=i[2];(s.startsWith('"')&&s.endsWith('"')||s.startsWith("'")&&s.endsWith("'"))&&(s=s.slice(1,-1)),r(i[1],s)}}catch{}try{let n=te();if(f.existsSync(n)){let e=JSON.parse(f.readFileSync(n,"utf8"));e&&typeof e=="object"&&(r("ORACLE_DESK_URL",e.deskUrl||e.dataUrl||e.url),r("ORACLE_DATA_URL",e.dataUrl||e.deskUrl||e.url),r("ORACLE_API_URL",e.apiUrl||e.dataUrl||e.deskUrl),r("ORACLE_PUBLIC_URL",e.publicUrl||e.deskUrl||e.dataUrl),r("ORACLE_EXEC_URL",e.execUrl),r("MAD_DESK_URL",e.deskUrl||e.dataUrl))}}catch{}let a=process.env.ORACLE_DESK_URL||process.env.ORACLE_DATA_URL||"";return a&&(r("ORACLE_DESK_URL",a),r("ORACLE_DATA_URL",a),r("ORACLE_API_URL",a),r("ORACLE_PUBLIC_URL",a),r("MAD_DESK_URL",a)),c._result=Object.keys(o).length?o:null,c._result}try{c()}catch{}var Ai={name:"receipt",summary:"say whether an on-chain action happened (hash or it did not)",group:"read",usage:"oracle receipt --hash <txid> | oracle receipt --json '<receipt>'",async run(t){let o=t.argv||[],r={},a=o.indexOf("--hash"),n=o.indexOf("--json");if(a>=0)r={transactionHash:o[a+1]};else if(n>=0)try{r=JSON.parse(o[n+1]||"{}")}catch(i){return process.stderr.write(`receipt: bad json: ${i.message}
|
|
2
2
|
`),1}let e=l(r);return o.includes("--quiet")?process.stdout.write(`${JSON.stringify(e)}
|
|
3
3
|
`):e.happened?process.stdout.write(`happened ${e.hash}
|
|
4
4
|
`):process.stdout.write(`did not happen ${e.note}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import{keccak_256 as
|
|
2
|
-
`),h=Se("sha256").update(u).digest("hex").slice(0,32),w=`${n.untrustedUrl?"untrusted":"trusted"}:${n.maxResponseBytes??"unbounded"}`;return`${t} ${e} ${w} ${h}`}function $e(t,e){let r=Number(e);return Number.isFinite(r)&&r>0?Math.min(r*1e3,X):Math.min(250*2**t,X)+Math.floor(Math.random()*100)}var Ne=t=>new Promise(e=>setTimeout(e,t));function k(t,e={}){let r=new Error(t);return r.retryable=!1,Object.assign(r,e),r}function z(t,e,r){return k(`HTTP response from ${t} exceeded maxResponseBytes ${r} (${e})`,{oversize:!0})}function P(t){try{let e=t?.body?.cancel?.();e&&typeof e.then=="function"&&e.catch(()=>{})}catch{}}function Le(t){return t?t.byteLength??t.length??0:0}async function Q(t,e,{url:r,truncate:n=!1,onOversize:o}={}){if(e==null)return await t.text();let c=Number(t.headers?.get?.("content-length"));if(Number.isFinite(c)&&c>e&&(P(t),!n))throw z(r,`content-length ${c}`,e);let i=t.body?.getReader?.();if(!i){let s=await t.text(),a=Buffer.byteLength(s,"utf8");if(a>e){if(!n)throw z(r,`body ${a} bytes`,e);return Buffer.from(s,"utf8").subarray(0,e).toString("utf8")}return s}let u=[],h=0,w=!1;try{for(;;){let{value:s,done:a}=await i.read();if(a)break;if(s&&(u.push(Buffer.from(s)),h+=Le(s),h>e)){w=!0;break}}}finally{if(w)try{await i.cancel()}catch{}try{i.releaseLock?.()}catch{}}if(w&&(typeof o=="function"&&o(),!n))throw z(r,`streamed ${h} bytes`,e);let d=Buffer.concat(u);return(w?d.subarray(0,e):d).toString("utf8")}function ee(t){if(!t)return null;try{return JSON.parse(t)}catch{return null}}async function He(t,{fetchImpl:e,method:r,headers:n,body:o,timeoutMs:c,lookupFn:i,realFetch:u,untrustedUrl:h=!1,maxResponseBytes:w=null,importUndici:d,validateResponse:s}){let a=new AbortController,l=setTimeout(()=>a.abort(),c),f=null,R=e,H=i?{lookupFn:i}:{};if(h&&!u&&!D(R))throw k(`HTTP refused ${t}: untrustedUrl requires a pin-capable fetchImpl (see markPinCapableFetch in egress-guard.mjs) or no fetchImpl override so Oracle can pin the connection itself`);let I=async(m,{status:b=null}={})=>{let g=await U(m,H);if(!g.ok)throw k(b==null?`HTTP refused ${m}: ${g.error}`:`HTTP redirect to ${m} ${g.error}`,b==null?{}:{status:b});let p=new URL(m).hostname;if(u){if(f&&(await f.close(),f=null),!f)try{f=await O({requireUndici:!0,...d?{importUndici:d}:{}})}catch(y){throw k(b==null?`HTTP refused ${m}: ${y?.message||y}`:`HTTP redirect to ${m} refused: ${y?.message||y}`,b==null?{}:{status:b})}f.pin(p,g.addresses),R=f.fetch}else W(R,p,g.addresses);return g};try{let m=String(t),b={...n||{}};h&&await I(m);for(let g=0;g<=Z;g+=1){let p=await R(m,{method:r,headers:b,body:o,signal:a.signal,redirect:"manual"});if(ve.has(p.status)){if(r!=="GET"&&r!=="HEAD"){let S=await Q(p,w??Te,{url:m,truncate:!0}),A=new Error(`HTTP ${p.status} ${r} ${m} redirected non-idempotent request`);throw A.status=p.status,A.body=ee(S)??S.slice(0,300),A}if(g===Z)throw P(p),new Error(`HTTP redirect loop for ${t}`);let E=p.headers?.get?.("location"),x;try{x=Ce(E,m)}catch(S){throw P(p),S}let $=!ke(x,m);if(P(p),$&&(b=Ie(b)),h)await I(x,{status:p.status});else if($){let S=await U(x,H);if(!S.ok){let A=new Error(`HTTP redirect from ${m} ${S.error}`);throw A.status=p.status,A.retryable=!1,A}u&&S.addresses?.length&&(f||(f=await O(d?{importUndici:d}:{})),f&&(f.pin(new URL(x).hostname,S.addresses),R=f.fetch))}m=x;continue}if(typeof s=="function")try{await s(p,{url:m})}catch(E){throw P(p),k(E?.message||String(E))}let y=await Q(p,w,{url:m,onOversize:()=>a.abort()}),C=ee(y);if(!p.ok){let E=new Error(`HTTP ${p.status} ${r} ${m}`);throw E.status=p.status,E.retryAfter=p.headers?.get?.("retry-after")??null,E.body=C??y.slice(0,300),E}return C??y}throw new Error(`HTTP redirect loop for ${t}`)}finally{clearTimeout(l),f&&await f.close()}}async function re(t,e={}){let r=e.fetchImpl||globalThis.fetch;if(typeof r!="function")throw new Error("fetch unavailable \u2014 pass opts.fetchImpl");let n=e.timeoutMs??12e3,o=(e.method||"GET").toUpperCase(),c={Accept:"application/json",...e.headers||{}},i=e.body;i!=null&&typeof i!="string"&&(c["Content-Type"]=c["Content-Type"]||"application/json",i=JSON.stringify(i));let u=Number.isInteger(e.retries)?Math.max(e.retries,0):Ae,h=e.lookupFn,w=!e.fetchImpl,d=e.untrustedUrl===!0,s=e.importUndici,a=e.validateResponse,l=Number(e.maxResponseBytes),f=Number.isFinite(l)&&l>0?Math.floor(l):null,R=async()=>{let g;for(let p=0;p<=u;p++)try{return await He(t,{fetchImpl:r,method:o,headers:c,body:i,timeoutMs:n,lookupFn:h,realFetch:w,untrustedUrl:d,maxResponseBytes:f,importUndici:s,validateResponse:a})}catch(y){g=y;let C=y?.status,E=y?.name==="AbortError",x=new Set([408,425,429]),$=y?.retryable===!1?!1:C!=null?x.has(C)||xe.has(C)&&K.has(o):!E&&K.has(o);if(p===u||!$)throw y;await Ne($e(p,y?.retryAfter))}throw g};if(!(e.dedupe!==!1&&o==="GET"&&i==null))return R();let I=Pe(o,t,c,{untrustedUrl:d,maxResponseBytes:f}),m=j.get(I);if(m)return m;let b=R().finally(()=>j.delete(I));return j.set(I,b),b}var ne={robinhood:{chainId:4663,name:"Robinhood Chain",rpcEnv:["RH_CHAIN_RPC"],evm:!0},ethereum:{chainId:1,name:"Ethereum",rpcEnv:["ETH_RPC_URL","ETHEREUM_RPC_URL","MAINNET_RPC_URL"],evm:!0},polygon:{chainId:137,name:"Polygon",rpcEnv:["POLYGON_RPC_URL","POLYGON_RPC"],evm:!0},arbitrum:{chainId:42161,name:"Arbitrum One",rpcEnv:["ARBITRUM_RPC_URL","ARB_RPC_URL"],evm:!0},base:{chainId:8453,name:"Base",rpcEnv:["BASE_RPC_URL"],evm:!0},hyperevm:{chainId:999,name:"HyperEVM",rpcEnv:["HYPEREVM_RPC_URL","HYPER_EVM_RPC"],evm:!0},bsc:{chainId:56,name:"BNB Smart Chain",rpcEnv:["BSC_RPC_URL","BNB_RPC_URL"],evm:!0},avalanche:{chainId:43114,name:"Avalanche C-Chain",rpcEnv:["AVALANCHE_RPC_URL","AVAX_RPC_URL"],evm:!0},optimism:{chainId:10,name:"OP Mainnet",rpcEnv:["OPTIMISM_RPC_URL","OP_RPC_URL"],evm:!0},abstract:{chainId:2741,name:"Abstract",rpcEnv:["ABSTRACT_RPC_URL","ABS_RPC_URL"],evm:!0},stable:{chainId:988,name:"Stable Mainnet",rpcEnv:["STABLE_RPC_URL","STABLE_RPC"],evm:!0}},Be=new Map(Object.values(ne).map(t=>[t.chainId,t]));function oe(t){return Be.get(Number(t))||null}function se(t,e=process.env){let r=oe(t);if(!r)return null;for(let n of r.rpcEnv){let o=(e[n]||"").trim();if(o)return o}return null}import{Interface as Me,getAddress as lt}from"ethers";var ft=new Me(["function allowance(address owner,address spender) view returns (uint256)","function balanceOf(address account) view returns (uint256)"]);var Ue={1:"https://ethereum.publicnode.com",137:"https://polygon-bor-rpc.publicnode.com",42161:"https://arbitrum-one-rpc.publicnode.com",8453:"https://base-rpc.publicnode.com",10:"https://optimism-rpc.publicnode.com",988:"https://rpc.stable.xyz",56:"https://bsc-rpc.publicnode.com",43114:"https://avalanche-c-chain-rpc.publicnode.com",999:"https://rpc.hyperliquid.xyz/evm",2741:"https://api.mainnet.abs.xyz",4663:"https://rpc.mainnet.chain.robinhood.com"};function Oe(t,{rpcUrl:e,env:r=process.env}={}){if(e)return e;let n=se(t,r);return n||Ue[Number(t)]||null}var Fe=/^(?:eth_(?:call|blocknumber|chainid|get[a-z0-9]+|feehistory|gasprice|maxpriorityfeepergas|syncing|protocolversion|estimategas|createaccesslist)|net_(?:version|listening|peercount)|web3_(?:clientversion|sha3))$/;function De(t){let e=String(t||""),r=e.toLowerCase();if(e!==e.trim()||!/^[a-zA-Z0-9_]+$/.test(e)||!Fe.test(r))throw new Error(`evm-rpc: ${e} refused \u2014 @oracle-agent/oracle is prepare-only (read RPC only; no broadcast/sign)`);return r}async function ae(t,e,r=[],n={}){let o=String(e||"");De(o);let c=Oe(t,n);if(!c)throw new Error(`No RPC URL for chainId ${t} (set env from chain registry rpcEnv or pass rpcUrl)`);let u=await re(c,{method:"POST",body:{jsonrpc:"2.0",id:1,method:e,params:r},fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??12e3});if(u?.error){let h=new Error(u.error.message||JSON.stringify(u.error));throw h.code=u.error.code,h}return u.result}var Y=999,G=1,je=8453,ce="0x1d9d87eBc14e71490bB87f1C39F65BDB979f3cb7",ze="0x4d5e4ed4D5e4A160Fa136853597cDc2eBBe66494",ie="0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e",Ve="0xC6d566A56A1aFf6508b41f6c90ff131615583BCD",Ge=".80002105.reverse",q=/^0x[a-fA-F0-9]{40}$/,ue=new TextEncoder,le=t=>"0x"+Buffer.from(t).toString("hex"),T=t=>le(V(ue.encode(t))).slice(0,10),fe=t=>t.toLowerCase().replace(/^0x/,"").padStart(64,"0");function L(t){let e=new Uint8Array(32);if(t)for(let r of String(t).split(".").reverse()){let n=V(ue.encode(r)),o=new Uint8Array(64);o.set(e,0),o.set(n,32),e=V(o)}return le(e)}function J(t){if(!t||t==="0x"||/^0x0*$/.test(t))return"";try{let e=t.slice(2),r=parseInt(e.slice(0,64),16)*2,n=parseInt(e.slice(r,r+64),16);if(!Number.isFinite(n)||n<=0)return"";let o=e.slice(r+64,r+64+n*2);return Buffer.from(o,"hex").toString("utf8")}catch{return""}}async function _(t,e,r){try{return await ae(t,"eth_call",[{to:e,data:r},"latest"])}catch{return null}}async function Ye(t){let e=await _(Y,ce,T("primaryName(address)")+fe(t)),r=J(e);return r?r.endsWith(".hl")?r:`${r}.hl`:null}async function qe(t){let e=await _(Y,ze,T("getName(address)")+fe(t)),r=J(e);return r?r.endsWith(".hype")?r:`${r}.hype`:null}async function de(t,e,r){let n=await _(t,r,T("name(bytes32)")+e.slice(2));return J(n)||null}async function Je(t){let e=L(`${t.slice(2).toLowerCase()}.addr.reverse`),r=await _(G,ie,T("resolver(bytes32)")+e.slice(2));if(!r)return null;let n="0x"+r.slice(-40);return/^0x0+$/.test(n)?null:de(G,e,n)}async function We(t){let e=L(t.slice(2).toLowerCase()+Ge);return de(je,e,Ve)}var pe=[{source:"hl",fn:Ye},{source:"hype",fn:qe},{source:"ens",fn:Je},{source:"basename",fn:We}];async function he(t){if(!q.test(String(t||"").trim()))return null;let e=String(t).trim();for(let{source:r,fn:n}of pe){let o=await n(e);if(o)return{name:o,source:r,address:e}}return null}async function Ke(t){let e=L(t),r=await _(Y,ce,T("ownerOf(uint256)")+e.slice(2));if(!r||r.length<66)return null;let n="0x"+r.slice(-40);return/^0x0+$/.test(n)?null:n}async function Xe(t,e,r){let n=L(e),o=await _(t,r,T("resolver(bytes32)")+n.slice(2));if(!o)return null;let c="0x"+o.slice(-40);if(/^0x0+$/.test(c))return null;let i=await _(t,c,T("addr(bytes32)")+n.slice(2));if(!i)return null;let u="0x"+i.slice(-40);return/^0x0+$/.test(u)?null:u}async function me(t){let e=String(t||"").trim().toLowerCase();if(!e||!e.includes("."))return null;if(e.endsWith(".hl")){let r=await Ke(e);return r?{address:r,source:"hl",name:e}:null}if(e.endsWith(".eth")){let r=await Xe(G,e,ie);return r?{address:r,source:e.endsWith(".base.eth")?"basename":"ens",name:e}:null}return null}var we=pe.map(t=>t.source);var ye=`oracle resolve <name-or-address> [--json]
|
|
1
|
+
import{keccak_256 as Y}from"@noble/hashes/sha3.js";import{createHash as ve}from"node:crypto";import v from"node:net";import Se from"node:dns";var Re=new Set(["localhost","metadata.google.internal","metadata.goog"]);function B(t){let e=String(t).toLowerCase().split("%")[0];if((e.match(/::/g)||[]).length>1)return null;let r=d=>{if(!d)return[];let s=d.split(":"),a=s.at(-1);if(a?.includes(".")){let i=a.split(".").map(Number);if(i.length!==4||i.some(b=>!Number.isInteger(b)||b<0||b>255))return null;s.splice(s.length-1,1,(i[0]<<8|i[1]).toString(16),(i[2]<<8|i[3]).toString(16))}return s.some(i=>!/^[0-9a-f]{1,4}$/.test(i))?null:s.map(i=>Number.parseInt(i,16))},[n,o]=e.split("::"),c=r(n),u=r(o);if(!c||!u)return null;let f=e.includes("::"),p=8-c.length-u.length;if(!f&&p!==0||f&&p<1)return null;let m=[...c,...Array(Math.max(0,p)).fill(0),...u];return m.length!==8?null:Uint8Array.from(m.flatMap(d=>[d>>8,d&255]))}function O(t,e,r){let n=Math.floor(r/8),o=r%8;for(let u=0;u<n;u+=1)if(t[u]!==e[u])return!1;if(!o)return!0;let c=255<<8-o;return(t[n]&c)===(e[n]&c)}function U(t){if(v.isIPv4(t)){let e=t.split(".").map(Number);return!(e[0]===0||e[0]===10||e[0]===127||e[0]>=224||e[0]===100&&e[1]>=64&&e[1]<=127||e[0]===169&&e[1]===254||e[0]===172&&e[1]>=16&&e[1]<=31||e[0]===192&&(e[1]===0||e[1]===2||e[1]===168)||e[0]===192&&e[1]===88&&e[2]===99||e[0]===198&&(e[1]===18||e[1]===19||e[1]===51)||e[0]===203&&e[1]===0&&e[2]===113)}if(v.isIPv6(t)){let e=B(t);if(!e)return!1;let r=B("::ffff:0:0");return O(e,r,96)?U([...e.slice(12)].join(".")):O(e,B("2000::"),3)?![["2001::",23],["2001:db8::",32],["2001:10::",28],["2001:2::",48],["2002::",16],["3fff::",20]].some(([o,c])=>O(e,B(o),c)):!1}return!1}function xe(t){let e;try{e=new URL(String(t))}catch{return{ok:!1,error:`not a valid URL: ${String(t).slice(0,120)}`}}if(e.protocol!=="http:"&&e.protocol!=="https:")return{ok:!1,error:`refused protocol ${e.protocol} (only http/https)`};let r=e.hostname.toLowerCase().replace(/^\[|\]$/g,"").replace(/\.+$/,"");if(Re.has(r)||r.endsWith(".localhost")||r.endsWith(".internal"))return{ok:!1,error:`refused internal host ${r}`};let n=v.isIP(r);return n!==0&&!U(r)?{ok:!1,error:`refused private address ${r}`}:{ok:!0,url:e,host:r,isLiteralIp:n!==0}}async function F(t,{lookupFn:e=Se.promises.lookup}={}){let r=xe(t);if(!r.ok)return r;if(r.isLiteralIp)return{ok:!0,url:r.url,addresses:[{address:r.host,family:v.isIPv6(r.host)?6:4}]};let n;try{n=await e(r.host,{all:!0,verbatim:!0})}catch{return{ok:!1,error:`refused: ${r.host} did not resolve`}}return!Array.isArray(n)||n.length===0||n.some(o=>!U(o.address))?{ok:!1,error:`refused: ${r.host} resolves to a non-public address`}:{ok:!0,url:r.url,addresses:n}}async function D({requireUndici:t=!1,importUndici:e=()=>import("undici")}={}){let r,n;try{let s=await e();r=s.Agent,n=s.fetch}catch(s){if(t)throw new Error(`egress-guard: untrustedUrl pinning requires the undici package, which failed to load: ${s?.message||s}`);return null}if(typeof r!="function"||typeof n!="function"){if(t)throw new Error("egress-guard: untrustedUrl pinning requires undici's Agent and fetch exports, which were not found on the imported module");return null}let o=s=>String(s).toLowerCase().replace(/^\[|\]$/g,"").replace(/\.+$/,""),c=new Map,u=s=>(Array.isArray(s)?s:[s]).map(a=>typeof a=="string"?{address:a}:a).filter(a=>a&&a.address).map(a=>({address:a.address,family:a.family||(v.isIPv6(a.address)?6:4)})),f=(s,a,i)=>{c.set(o(s),u(typeof a=="string"?[{address:a,family:i}]:a))},p=s=>{let a=o(s);if(v.isIP(a))return[{address:a,family:v.isIPv6(a)?6:4}];let i=c.get(a);if(!i||!i.length)throw new Error(`refused: unpinned host ${s} during pinned fetch`);return i},m=new r({connect:{lookup(s,a,i){let b;try{b=p(s)}catch(I){return i(I)}return a?.all?i(null,b):i(null,b[0].address,b[0].family)}}}),d=Ae((s,a={})=>n(s,{...a,dispatcher:m}),f);return{dispatcher:m,fetch:d,pin:f,resolve:p,async close(){try{await m.destroy()}catch{}}}}var j=Symbol.for("oracle.egressGuard.pinCapableFetch");function Ae(t,e){if(typeof t!="function")throw new Error("markPinCapableFetch: fetchImpl must be a function");if(typeof e!="function")throw new Error("markPinCapableFetch: pin must be a function");return t[j]=Object.freeze({pin:e}),t}function z(t){return typeof t=="function"&&typeof t[j]?.pin=="function"}function X(t,e,r){if(!z(t))throw new Error("pinFetchToAddresses: fetchImpl is not pin-capable");t[j].pin(e,r)}var Te=new Set([408,425,429,500,502,503,504]),Z=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),_e=2,Q=4e3,ne=["authorization","x-api-key","x-tensor-api-key","0x-api-key","api-key","cookie","proxy-authorization"],Ie=new Set([301,302,303,307,308]),ee=3,Ce=64*1024;function Pe(t){let e=String(t||"").toLowerCase();return ne.includes(e)||/(^|-)(api[-_]?key|key|token|secret|auth|authorization|session|cookie|signature|access)(-|$)/.test(e)}function ke(t){let e={};for(let[r,n]of Object.entries(t||{}))Pe(r)||(e[r]=n);return e}function $e(t,e){if(!t)throw new Error(`HTTP redirect from ${e} missing Location`);let r=new URL(String(t),String(e));if(r.protocol!=="http:"&&r.protocol!=="https:")throw new Error(`HTTP redirect from ${e} used unsupported protocol ${r.protocol}`);return r.toString()}function Ne(t,e){return new URL(String(t)).origin===new URL(String(e)).origin}var V=new Map;function Le(t,e,r,n={}){let o={};for(let[d,s]of Object.entries(r||{}))o[d.toLowerCase()]=s;let c=Object.keys(o).filter(d=>/(^|-)(api[-_]?key|key|token|secret|auth|authorization|session|cookie|signature|access)(-|$)/.test(d)),f=[...new Set([...ne,...c])].sort().map(d=>`${d}=${o[d]??""}`).join(`
|
|
2
|
+
`),p=ve("sha256").update(f).digest("hex").slice(0,32),m=`${n.untrustedUrl?"untrusted":"trusted"}:${n.maxResponseBytes??"unbounded"}`;return`${t} ${e} ${m} ${p}`}function He(t,e){let r=Number(e);return Number.isFinite(r)&&r>0?Math.min(r*1e3,Q):Math.min(250*2**t,Q)+Math.floor(Math.random()*100)}var Be=t=>new Promise(e=>setTimeout(e,t));function N(t,e={}){let r=new Error(t);return r.retryable=!1,Object.assign(r,e),r}function G(t,e,r){return N(`HTTP response from ${t} exceeded maxResponseBytes ${r} (${e})`,{oversize:!0})}function L(t){try{let e=t?.body?.cancel?.();e&&typeof e.then=="function"&&e.catch(()=>{})}catch{}}function Me(t){return t?t.byteLength??t.length??0:0}async function te(t,e,{url:r,truncate:n=!1,onOversize:o}={}){if(e==null)return await t.text();let c=Number(t.headers?.get?.("content-length"));if(Number.isFinite(c)&&c>e&&(L(t),!n))throw G(r,`content-length ${c}`,e);let u=t.body?.getReader?.();if(!u){let s=await t.text(),a=Buffer.byteLength(s,"utf8");if(a>e){if(!n)throw G(r,`body ${a} bytes`,e);return Buffer.from(s,"utf8").subarray(0,e).toString("utf8")}return s}let f=[],p=0,m=!1;try{for(;;){let{value:s,done:a}=await u.read();if(a)break;if(s&&(f.push(Buffer.from(s)),p+=Me(s),p>e)){m=!0;break}}}finally{if(m)try{await u.cancel()}catch{}try{u.releaseLock?.()}catch{}}if(m&&(typeof o=="function"&&o(),!n))throw G(r,`streamed ${p} bytes`,e);let d=Buffer.concat(f);return(m?d.subarray(0,e):d).toString("utf8")}function re(t){if(!t)return null;try{return JSON.parse(t)}catch{return null}}async function Oe(t,{fetchImpl:e,method:r,headers:n,body:o,timeoutMs:c,lookupFn:u,realFetch:f,untrustedUrl:p=!1,maxResponseBytes:m=null,importUndici:d,validateResponse:s,signal:a}){let i=new AbortController,b=setTimeout(()=>i.abort(),c),I=a?typeof AbortSignal.any=="function"?AbortSignal.any([a,i.signal]):a:i.signal,w=null,C=e,P=u?{lookupFn:u}:{};if(p&&!f&&!z(C))throw N(`HTTP refused ${t}: untrustedUrl requires a pin-capable fetchImpl (see markPinCapableFetch in egress-guard.mjs) or no fetchImpl override so Oracle can pin the connection itself`);let k=async(h,{status:g=null}={})=>{let y=await F(h,P);if(!y.ok)throw N(g==null?`HTTP refused ${h}: ${y.error}`:`HTTP redirect to ${h} ${y.error}`,g==null?{}:{status:g});let l=new URL(h).hostname;if(f){if(w&&(await w.close(),w=null),!w)try{w=await D({requireUndici:!0,...d?{importUndici:d}:{}})}catch(E){throw N(g==null?`HTTP refused ${h}: ${E?.message||E}`:`HTTP redirect to ${h} refused: ${E?.message||E}`,g==null?{}:{status:g})}w.pin(l,y.addresses),C=w.fetch}else X(C,l,y.addresses);return y};try{let h=String(t),g={...n||{}};p&&await k(h);for(let y=0;y<=ee;y+=1){let l=await C(h,{method:r,headers:g,body:o,signal:I,redirect:"manual"});if(Ie.has(l.status)){if(r!=="GET"&&r!=="HEAD"){let R=await te(l,m??Ce,{url:h,truncate:!0}),x=new Error(`HTTP ${l.status} ${r} ${h} redirected non-idempotent request`);throw x.status=l.status,x.body=re(R)??R.slice(0,300),x}if(y===ee)throw L(l),new Error(`HTTP redirect loop for ${t}`);let S=l.headers?.get?.("location"),A;try{A=$e(S,h)}catch(R){throw L(l),R}let $=!Ne(A,h);if(L(l),$&&(g=ke(g)),p)await k(A,{status:l.status});else if($){let R=await F(A,P);if(!R.ok){let x=new Error(`HTTP redirect from ${h} ${R.error}`);throw x.status=l.status,x.retryable=!1,x}f&&R.addresses?.length&&(w||(w=await D(d?{importUndici:d}:{})),w&&(w.pin(new URL(A).hostname,R.addresses),C=w.fetch))}h=A;continue}if(typeof s=="function")try{await s(l,{url:h})}catch(S){throw L(l),N(S?.message||String(S))}let E=await te(l,m,{url:h,onOversize:()=>i.abort()}),H=re(E);if(!l.ok){let S=new Error(`HTTP ${l.status} ${r} ${h}`);throw S.status=l.status,S.retryAfter=l.headers?.get?.("retry-after")??null,S.body=H??E.slice(0,300),S}return H??E}throw new Error(`HTTP redirect loop for ${t}`)}finally{clearTimeout(b),w&&await w.close()}}async function oe(t,e={}){let r=e.fetchImpl||globalThis.fetch;if(typeof r!="function")throw new Error("fetch unavailable \u2014 pass opts.fetchImpl");let n=e.timeoutMs??12e3,o=(e.method||"GET").toUpperCase(),c={Accept:"application/json",...e.headers||{}},u=e.body;u!=null&&typeof u!="string"&&(c["Content-Type"]=c["Content-Type"]||"application/json",u=JSON.stringify(u));let f=Number.isInteger(e.retries)?Math.max(e.retries,0):_e,p=e.lookupFn,m=!e.fetchImpl,d=e.untrustedUrl===!0,s=e.importUndici,a=e.validateResponse,i=e.signal,b=Number(e.maxResponseBytes),I=Number.isFinite(b)&&b>0?Math.floor(b):null,w=async()=>{let g;for(let y=0;y<=f;y++){i?.throwIfAborted?.();try{return await Oe(t,{fetchImpl:r,method:o,headers:c,body:u,timeoutMs:n,lookupFn:p,realFetch:m,untrustedUrl:d,maxResponseBytes:I,importUndici:s,validateResponse:a,signal:i})}catch(l){g=l;let E=l?.status,H=l?.name==="AbortError"||l?.name==="TimeoutError"||i?.aborted,S=new Set([408,425,429]),A=l?.retryable===!1?!1:E!=null?S.has(E)||Te.has(E)&&Z.has(o):!H&&Z.has(o);if(y===f||!A)throw l;let $=He(y,l?.retryAfter);i?await new Promise((R,x)=>{let Ee=setTimeout(R,$);i.addEventListener("abort",()=>{clearTimeout(Ee),x(i.reason||new DOMException("Aborted","AbortError"))},{once:!0})}):await Be($)}}throw g};if(!(e.dedupe!==!1&&!i&&o==="GET"&&u==null))return w();let P=Le(o,t,c,{untrustedUrl:d,maxResponseBytes:I}),k=V.get(P);if(k)return k;let h=w().finally(()=>V.delete(P));return V.set(P,h),h}var se={robinhood:{chainId:4663,name:"Robinhood Chain",rpcEnv:["RH_CHAIN_RPC"],evm:!0},ethereum:{chainId:1,name:"Ethereum",rpcEnv:["ETH_RPC_URL","ETHEREUM_RPC_URL","MAINNET_RPC_URL"],evm:!0},polygon:{chainId:137,name:"Polygon",rpcEnv:["POLYGON_RPC_URL","POLYGON_RPC"],evm:!0},arbitrum:{chainId:42161,name:"Arbitrum One",rpcEnv:["ARBITRUM_RPC_URL","ARB_RPC_URL"],evm:!0},base:{chainId:8453,name:"Base",rpcEnv:["BASE_RPC_URL"],evm:!0},hyperevm:{chainId:999,name:"HyperEVM",rpcEnv:["HYPEREVM_RPC_URL","HYPER_EVM_RPC"],evm:!0},bsc:{chainId:56,name:"BNB Smart Chain",rpcEnv:["BSC_RPC_URL","BNB_RPC_URL"],evm:!0},avalanche:{chainId:43114,name:"Avalanche C-Chain",rpcEnv:["AVALANCHE_RPC_URL","AVAX_RPC_URL"],evm:!0},optimism:{chainId:10,name:"OP Mainnet",rpcEnv:["OPTIMISM_RPC_URL","OP_RPC_URL"],evm:!0},abstract:{chainId:2741,name:"Abstract",rpcEnv:["ABSTRACT_RPC_URL","ABS_RPC_URL"],evm:!0},stable:{chainId:988,name:"Stable Mainnet",rpcEnv:["STABLE_RPC_URL","STABLE_RPC"],evm:!0}},Ue=new Map(Object.values(se).map(t=>[t.chainId,t]));function ae(t){return Ue.get(Number(t))||null}function ce(t,e=process.env){let r=ae(t);if(!r)return null;for(let n of r.rpcEnv){let o=(e[n]||"").trim();if(o)return o}return null}import{Interface as Fe,getAddress as pt}from"ethers";var ht=new Fe(["function allowance(address owner,address spender) view returns (uint256)","function balanceOf(address account) view returns (uint256)"]);var De={1:"https://ethereum.publicnode.com",137:"https://polygon-bor-rpc.publicnode.com",42161:"https://arbitrum-one-rpc.publicnode.com",8453:"https://base-rpc.publicnode.com",10:"https://optimism-rpc.publicnode.com",988:"https://rpc.stable.xyz",56:"https://bsc-rpc.publicnode.com",43114:"https://avalanche-c-chain-rpc.publicnode.com",999:"https://rpc.hyperliquid.xyz/evm",2741:"https://api.mainnet.abs.xyz",4663:"https://rpc.mainnet.chain.robinhood.com"};function je(t,{rpcUrl:e,env:r=process.env}={}){if(e)return e;let n=ce(t,r);return n||De[Number(t)]||null}var ze=/^(?:eth_(?:call|blocknumber|chainid|get[a-z0-9]+|feehistory|gasprice|maxpriorityfeepergas|syncing|protocolversion|estimategas|createaccesslist)|net_(?:version|listening|peercount)|web3_(?:clientversion|sha3))$/;function Ve(t){let e=String(t||""),r=e.toLowerCase();if(e!==e.trim()||!/^[a-zA-Z0-9_]+$/.test(e)||!ze.test(r))throw new Error(`evm-rpc: ${e} refused \u2014 @oracle-agent/oracle is prepare-only (read RPC only; no broadcast/sign)`);return r}async function ie(t,e,r=[],n={}){let o=String(e||"");Ve(o);let c=je(t,n);if(!c)throw new Error(`No RPC URL for chainId ${t} (set env from chain registry rpcEnv or pass rpcUrl)`);let f=await oe(c,{method:"POST",body:{jsonrpc:"2.0",id:1,method:e,params:r},fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??12e3,signal:n.signal});if(f?.error){let p=new Error(f.error.message||JSON.stringify(f.error));throw p.code=f.error.code,p}return f.result}var J=999,q=1,Ge=8453,ue="0x1d9d87eBc14e71490bB87f1C39F65BDB979f3cb7",Ye="0x4d5e4ed4D5e4A160Fa136853597cDc2eBBe66494",le="0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e",qe="0xC6d566A56A1aFf6508b41f6c90ff131615583BCD",Je=".80002105.reverse",W=/^0x[a-fA-F0-9]{40}$/,fe=new TextEncoder,de=t=>"0x"+Buffer.from(t).toString("hex"),T=t=>de(Y(fe.encode(t))).slice(0,10),pe=t=>t.toLowerCase().replace(/^0x/,"").padStart(64,"0");function M(t){let e=new Uint8Array(32);if(t)for(let r of String(t).split(".").reverse()){let n=Y(fe.encode(r)),o=new Uint8Array(64);o.set(e,0),o.set(n,32),e=Y(o)}return de(e)}function K(t){if(!t||t==="0x"||/^0x0*$/.test(t))return"";try{let e=t.slice(2),r=parseInt(e.slice(0,64),16)*2,n=parseInt(e.slice(r,r+64),16);if(!Number.isFinite(n)||n<=0)return"";let o=e.slice(r+64,r+64+n*2);return Buffer.from(o,"hex").toString("utf8")}catch{return""}}async function _(t,e,r){try{return await ie(t,"eth_call",[{to:e,data:r},"latest"])}catch{return null}}async function We(t){let e=await _(J,ue,T("primaryName(address)")+pe(t)),r=K(e);return r?r.endsWith(".hl")?r:`${r}.hl`:null}async function Ke(t){let e=await _(J,Ye,T("getName(address)")+pe(t)),r=K(e);return r?r.endsWith(".hype")?r:`${r}.hype`:null}async function he(t,e,r){let n=await _(t,r,T("name(bytes32)")+e.slice(2));return K(n)||null}async function Xe(t){let e=M(`${t.slice(2).toLowerCase()}.addr.reverse`),r=await _(q,le,T("resolver(bytes32)")+e.slice(2));if(!r)return null;let n="0x"+r.slice(-40);return/^0x0+$/.test(n)?null:he(q,e,n)}async function Ze(t){let e=M(t.slice(2).toLowerCase()+Je);return he(Ge,e,qe)}var me=[{source:"hl",fn:We},{source:"hype",fn:Ke},{source:"ens",fn:Xe},{source:"basename",fn:Ze}];async function we(t){if(!W.test(String(t||"").trim()))return null;let e=String(t).trim();for(let{source:r,fn:n}of me){let o=await n(e);if(o)return{name:o,source:r,address:e}}return null}async function Qe(t){let e=M(t),r=await _(J,ue,T("ownerOf(uint256)")+e.slice(2));if(!r||r.length<66)return null;let n="0x"+r.slice(-40);return/^0x0+$/.test(n)?null:n}async function et(t,e,r){let n=M(e),o=await _(t,r,T("resolver(bytes32)")+n.slice(2));if(!o)return null;let c="0x"+o.slice(-40);if(/^0x0+$/.test(c))return null;let u=await _(t,c,T("addr(bytes32)")+n.slice(2));if(!u)return null;let f="0x"+u.slice(-40);return/^0x0+$/.test(f)?null:f}async function ye(t){let e=String(t||"").trim().toLowerCase();if(!e||!e.includes("."))return null;if(e.endsWith(".hl")){let r=await Qe(e);return r?{address:r,source:"hl",name:e}:null}if(e.endsWith(".eth")){let r=await et(q,e,le);return r?{address:r,source:e.endsWith(".base.eth")?"basename":"ens",name:e}:null}return null}var be=me.map(t=>t.source);var ge=`oracle resolve <name-or-address> [--json]
|
|
3
3
|
|
|
4
4
|
oracle resolve demi.hl
|
|
5
5
|
oracle resolve vitalik.eth
|
|
@@ -8,16 +8,16 @@ import{keccak_256 as V}from"@noble/hashes/sha3.js";import{createHash as Se}from"
|
|
|
8
8
|
Reads on-chain name records. No API key: HL Names publishes a paid REST API,
|
|
9
9
|
but the contract answers primaryName(address) for free.
|
|
10
10
|
|
|
11
|
-
Sources, in priority order: ${
|
|
12
|
-
`),n?0:1;try{if(
|
|
11
|
+
Sources, in priority order: ${be.join(", ")}.`;async function tt(t=[]){let e=t.filter(o=>o!=="--json"),r=t.includes("--json"),n=(e[0]||"").trim();if(!n||n==="--help"||n==="-h")return process.stdout.write(ge+`
|
|
12
|
+
`),n?0:1;try{if(W.test(n)){let c=await we(n);return r?(process.stdout.write(JSON.stringify({address:n,name:c?.name??null,source:c?.source??null})+`
|
|
13
13
|
`),0):c?(process.stdout.write(`${n}
|
|
14
14
|
${c.name} [${c.source}]
|
|
15
15
|
`),0):(process.stdout.write(`${n}
|
|
16
16
|
no name record found
|
|
17
|
-
`),0)}let o=await
|
|
17
|
+
`),0)}let o=await ye(n);return r?(process.stdout.write(JSON.stringify({name:n,address:o?.address??null,source:o?.source??null})+`
|
|
18
18
|
`),0):o?(process.stdout.write(`${n}
|
|
19
19
|
${o.address} [${o.source}]
|
|
20
20
|
`),0):(process.stdout.write(`${n}
|
|
21
21
|
unresolved (no owner record)
|
|
22
22
|
`),0)}catch(o){return process.stderr.write(`resolve failed: ${o?.message||o}
|
|
23
|
-
`),1}}var
|
|
23
|
+
`),1}}var Et={name:"resolve",summary:"resolve .hl/.hype/.eth names to addresses and back",usage:ge,async run(t){return tt(t.argv||[])}};export{Et as default};
|