@oracle-agent/oracle 0.25.2 → 0.25.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.
Files changed (33) hide show
  1. package/README.md +33 -1
  2. package/dist/assets/skills/oracle-desk-product/SKILL.md +1 -1
  3. package/dist/bin/desk-server.mjs +53 -53
  4. package/dist/bin/oracle-data-mcp.mjs +12 -12
  5. package/dist/bin/oracle-public-server.mjs +15 -15
  6. package/dist/bin/oracle-route.mjs +14 -14
  7. package/dist/cli/commands/chat.mjs +96 -96
  8. package/dist/cli/commands/doctor.mjs +3 -3
  9. package/dist/cli/commands/eval.mjs +414 -85
  10. package/dist/cli/commands/farm.mjs +21 -21
  11. package/dist/cli/commands/model.mjs +101 -101
  12. package/dist/cli/commands/receipt.mjs +2 -2
  13. package/dist/cli/commands/sign.mjs +9 -9
  14. package/dist/cli/commands/signer.mjs +12 -12
  15. package/dist/cli/commands/strategy.mjs +11 -11
  16. package/dist/cli/commands/swap.mjs +10 -10
  17. package/dist/cli/commands/venues.mjs +2 -2
  18. package/dist/data/desk-data.mjs +51 -51
  19. package/dist/data/providers/universal-evm-nft-transfer.mjs +1 -0
  20. package/dist/data/providers/universal-ordinals-transfer.mjs +1 -0
  21. package/dist/data/providers/universal-solana-nft-transfer.mjs +1 -0
  22. package/dist/index.mjs +55 -55
  23. package/dist/local-signer/index.mjs +3 -3
  24. package/dist/nft/index.mjs +1 -1
  25. package/dist/nft/universal-mint-router.mjs +47 -0
  26. package/dist/nft/universal-nft-lifecycle.mjs +1 -0
  27. package/dist/prepare-envelope.mjs +1 -1
  28. package/dist/router/index.mjs +9 -9
  29. package/dist/router/prepare-bridge.mjs +18 -18
  30. package/dist/strategy/index.mjs +11 -11
  31. package/package.json +6 -1
  32. package/public/oracle-splash/downloads/index.html +4 -4
  33. package/public/oracle-splash/index.html +1 -1
@@ -0,0 +1 @@
1
+ import{createHash as M,createHmac as I,timingSafeEqual as B}from"node:crypto";var q=2,G=300*1e3,W=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})();function y(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(y).join(",")}]`:`{${Object.keys(e).sort().map(r=>`${JSON.stringify(r)}:${y(e[r])}`).join(",")}}`}function F(e){let t=String(e?.ORACLE_STAMP_HMAC_SECRET||"").trim();return t.length>=16?t:""}function R(e=process.env){return F(process.env)||F(e)}function k(e){let{prepareHash:t,prepareMac:r,note:n,...a}=e||{};return a}function P(e){let t=k(e);return M("sha256").update(y(t)).digest("hex")}function L(e,t=R()){return t?I("sha256",t).update(String(e)).digest("hex"):""}function $(e,{provider:t,kind:r,env:n=process.env,nowMs:a=Date.now(),expiresAtMs:o}={}){if(!e||typeof e!="object")throw new Error("stampPrepared: payload object required");let x=Object.prototype.hasOwnProperty.call(e,"oraclePrepared");if(x&&typeof e.oraclePrepared!="boolean")throw new Error("stampPrepared: oraclePrepared must be boolean");let f={...e,provider:e.provider||t,kind:e.kind||r,requiresUserSignature:e.requiresUserSignature!==!1,signingReady:!1,broadcastReady:!1,executionReady:!1,oraclePrepared:x?e.oraclePrepared:!0};if(!f.provider)throw new Error("stampPrepared: provider required");if(!f.kind)throw new Error("stampPrepared: kind required");let i=Number(a),u=o==null?i+G:Number(o),d=u-i;if(!Number.isSafeInteger(i)||!Number.isSafeInteger(u)||d<=0||d>W)throw new Error("stampPrepared: bounded preparedAt/expiresAt required");let s={...f,preparedAt:i,expiresAt:u,prepareVersion:q},p=P(s),m=R(n),E=m?L(p,m):void 0,N={...s,prepareHash:p};return E&&(N.prepareMac=E),N}var A="universal-evm-nft-transfer",S="evm-nft-safe-transfer",C=1800*1e3,j=Object.freeze({prepare:!0,erc721SafeTransferFrom:!0,erc1155SafeTransferFrom:!0,sign:!1,broadcast:!1,custody:!1}),H=/^(privateKey|secretKey|seed|mnemonic|signature|signatures|signed|signedTransaction|rawTransaction|rawTx|keystore|password)$/i;function g(e,t=new Set){if(!(!e||typeof e!="object"||t.has(e))){t.add(e);for(let[r,n]of Object.entries(e)){if(H.test(r))throw new Error(`evm nft transfer: ${r} refused; secret/signed material is outside this prepare-only adapter`);g(n,t)}}}function b(e,t){let r=String(e??"").trim().toLowerCase();if(!/^0x[0-9a-f]{40}$/.test(r)||/^0x0{40}$/.test(r))throw new Error(`evm nft transfer: valid non-zero ${t} address required`);return r}function c(e,t,{positive:r=!1,safe:n=!1}={}){let a=String(e??"").trim();if(!/^\d+$/.test(a))throw new Error(`evm nft transfer: ${t} must be an unsigned integer`);let o=BigInt(a);if(o>=1n<<256n||r&&o===0n)throw new Error(`evm nft transfer: ${t} is out of range`);if(n&&o>BigInt(Number.MAX_SAFE_INTEGER))throw new Error(`evm nft transfer: ${t} is out of range`);return o}var w=e=>e.toString(16).padStart(64,"0"),h=e=>e.slice(2).padStart(64,"0");function O(e,t,r,n,a){return e==="erc721"?`0x42842e0e${h(t)}${h(r)}${w(n)}`:`0xf242432a${h(t)}${h(r)}${w(n)}${w(a)}${w(160n)}${w(0n)}`}function T(e={},{nowMs:t=Date.now()}={}){if(!e||typeof e!="object"||Array.isArray(e))throw new Error("evm nft transfer: request object required");if(g(e),["sign","execute","broadcast","submit"].some(E=>e[E]===!0))throw new Error("evm nft transfer: execution refused; adapter is prepare-only");let r=String(e.standard??e.tokenStandard??"").toLowerCase().replace("-","");if(r!=="erc721"&&r!=="erc1155")throw new Error("evm nft transfer: standard must be exact ERC-721 or ERC-1155");let n=c(e.chainId,"chainId",{positive:!0,safe:!0}),a=b(e.sender??e.from,"sender"),o=b(e.recipient??e.to,"recipient"),x=b(e.contract??e.contractAddress??e.tokenContract,"contract"),f=c(e.tokenId,"tokenId"),i=c(e.quantity,"quantity",{positive:!0});if(r==="erc721"&&i!==1n)throw new Error("evm nft transfer: ERC-721 quantity must be exactly 1");if(c(e.valueWei??e.value??"0","valueWei")!==0n)throw new Error("evm nft transfer: zero native value is required");let u=c(e.gasLimit,"gasLimit",{positive:!0}),d=c(e.maxFeePerGasWei??e.maxFeePerGas,"maxFeePerGasWei",{positive:!0}),v=c(e.maxPriorityFeePerGasWei??e.maxPriorityFeePerGas,"maxPriorityFeePerGasWei");if(v>d)throw new Error("evm nft transfer: priority fee cap exceeds max fee cap");if(e.reviewed!==!0&&e.userConfirmed!==!0)throw new Error("evm nft transfer: reviewed=true required after reviewing chain, parties, NFT, quantity, fee caps, and expiry");let s=Number(e.expiresAt??e.expiry??e.expiresAtMs);if(!Number.isSafeInteger(s)||s<=Number(t)||s-Number(t)>C)throw new Error("evm nft transfer: expiry must be future and within 30 minutes");let p=O(r,a,o,f,i),m=e.calldata??e.data;if(m!=null&&String(m).toLowerCase()!==p)throw new Error("evm nft transfer: calldata mutation refused; only canonical safeTransferFrom is allowed");return{standard:r,chainId:Number(n),sender:a,recipient:o,contract:x,tokenId:f.toString(),quantity:i.toString(),gasLimit:u.toString(),maxFeePerGasWei:d.toString(),maxPriorityFeePerGasWei:v.toString(),expiresAt:s,data:p}}function l(e={},t={}){let r=T(e,t),n={provider:A,kind:S,execution:"prepare-only",signed:!1,requiresUserSignature:!0,executionReady:!1,signingReady:!1,broadcastReady:!1,oraclePrepared:!0,capabilities:{...j},fee:{oracleFeeBps:0,oracleFeeWei:"0"},transfer:{standard:r.standard,sender:r.sender,recipient:r.recipient,contract:r.contract,tokenId:r.tokenId,quantity:r.quantity},transaction:{chainId:r.chainId,from:r.sender,to:r.contract,data:r.data,value:"0",gasLimit:r.gasLimit,maxFeePerGasWei:r.maxFeePerGasWei,maxPriorityFeePerGasWei:r.maxPriorityFeePerGasWei},caps:{gasLimit:r.gasLimit,maxFeePerGasWei:r.maxFeePerGasWei,maxPriorityFeePerGasWei:r.maxPriorityFeePerGasWei,nativeValueWei:"0"},reviewed:!0,note:"Unsigned exact safeTransferFrom only; sign and broadcast in a user-controlled wallet."};return $(n,{provider:A,kind:S,env:t.env,nowMs:Number(t.nowMs??Date.now()),expiresAtMs:r.expiresAt})}function _(e,{nowMs:t=Date.now()}={}){if(!e||typeof e!="object")throw new Error("evm nft transfer: prepared envelope required");if(g({payload:e.transfer,transaction:e.transaction}),e.prepareHash!==P(e))throw new Error("evm nft transfer: prepareHash mismatch \u2014 payload was altered");if(e.provider!==A||e.kind!==S||e.oraclePrepared!==!0)throw new Error("evm nft transfer: envelope identity mutation refused");if(e.execution!=="prepare-only"||e.signed!==!1||e.executionReady!==!1||e.signingReady!==!1||e.broadcastReady!==!1)throw new Error("evm nft transfer: executable or signed mutation refused");if(Number(e.expiresAt)<=Number(t))throw new Error("evm nft transfer: reviewed expiry elapsed");let r=e.transfer||{},n=e.transaction||{},a=T({standard:r.standard,chainId:n.chainId,sender:r.sender,recipient:r.recipient,contract:r.contract,tokenId:r.tokenId,quantity:r.quantity,valueWei:n.value,gasLimit:n.gasLimit,maxFeePerGasWei:n.maxFeePerGasWei,maxPriorityFeePerGasWei:n.maxPriorityFeePerGasWei,expiresAt:e.expiresAt,reviewed:!0,calldata:n.data},{nowMs:t});if(n.from!==a.sender||n.to!==a.contract)throw new Error("evm nft transfer: sender or contract mutation refused");return!0}var X=l,z=l,K=l,J=l,Q=l,Y=_,Z=_;function ee(){throw new Error("evm nft transfer: signing refused; adapter is prepare-only")}function re(){throw new Error("evm nft transfer: broadcasting refused; adapter is prepare-only")}export{S as EVM_NFT_TRANSFER_KIND,C as EVM_NFT_TRANSFER_MAX_TTL_MS,A as EVM_NFT_TRANSFER_PROVIDER,_ as assertEvmNftTransfer,Z as assertUniversalEvmNftTransfer,re as evmNftTransferBroadcast,ee as evmNftTransferSign,K as prepareEvmNftTransfer,Q as prepareEvmNftTransferAdmin,J as prepareEvmNftTransferPublic,l as prepareUniversalEvmNftTransfer,z as prepareUniversalEvmNftTransferAdmin,X as prepareUniversalEvmNftTransferPublic,Y as validateEvmNftTransfer,T as validateEvmNftTransferRequest};
@@ -0,0 +1 @@
1
+ import{createHash as V,createHmac as z,timingSafeEqual as Y}from"node:crypto";var L=2,D=300*1e3,G=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})();function $(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map($).join(",")}]`:`{${Object.keys(e).sort().map(r=>`${JSON.stringify(r)}:${$(e[r])}`).join(",")}}`}function O(e){let t=String(e?.ORACLE_STAMP_HMAC_SECRET||"").trim();return t.length>=16?t:""}function N(e=process.env){return O(process.env)||O(e)}function J(e){let{prepareHash:t,prepareMac:r,note:i,...s}=e||{};return s}function A(e){let t=J(e);return V("sha256").update($(t)).digest("hex")}function K(e,t=N()){return t?z("sha256",t).update(String(e)).digest("hex"):""}function T(e,{provider:t,kind:r,env:i=process.env,nowMs:s=Date.now(),expiresAtMs:x}={}){if(!e||typeof e!="object")throw new Error("stampPrepared: payload object required");let h=Object.prototype.hasOwnProperty.call(e,"oraclePrepared");if(h&&typeof e.oraclePrepared!="boolean")throw new Error("stampPrepared: oraclePrepared must be boolean");let a={...e,provider:e.provider||t,kind:e.kind||r,requiresUserSignature:e.requiresUserSignature!==!1,signingReady:!1,broadcastReady:!1,executionReady:!1,oraclePrepared:h?e.oraclePrepared:!0};if(!a.provider)throw new Error("stampPrepared: provider required");if(!a.kind)throw new Error("stampPrepared: kind required");let u=Number(s),d=x==null?u+D:Number(x),l=d-u;if(!Number.isSafeInteger(u)||!Number.isSafeInteger(d)||l<=0||l>G)throw new Error("stampPrepared: bounded preparedAt/expiresAt required");let m={...a,preparedAt:u,expiresAt:d,prepareVersion:L},S=A(m),o=N(i),p=o?K(S,o):void 0,g={...m,prepareHash:S};return p&&(g.prepareMac=p),g}var P="universal-ordinals-transfer",E="bitcoin-ordinals-transfer-plan",I=Object.freeze({bitcoin:"000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f",mainnet:"000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f",regtest:"0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206"}),U=Object.freeze({prepareUnsignedPsbtV0:!0,exactOrdinalsTransfer:!0,sign:!1,finalize:!1,broadcast:!1,custody:!1});function n(e){throw new Error(`ordinals transfer: ${e}`)}function f(e,t){let r=String(e??"").trim();return r||n(`${t} required`),r}function c(e,t,{positive:r=!1,max:i=null}={}){/^\d+$/.test(String(e??""))||n(`${t} must be an integer`);let s=BigInt(e);return(r&&s<=0n||!r&&s<0n)&&n(`${t} must be ${r?"positive":"non-negative"}`),i!=null&&s>BigInt(i)&&n(`${t} out of range`),s}function v(e,t){let r=Number(e);return(!Number.isFinite(r)||r<=0)&&n(`${t} must be positive`),r}function _(e,t){let r=f(e,t).toLowerCase();return/^[0-9a-f]{64}$/.test(r)||n(`${t} must be 64 hex`),r}function j(e,t="inscriptionId"){let r=f(e,t).toLowerCase();return/^[0-9a-f]{64}i\d+$/.test(r)||n(`${t} must be canonical`),r}function H(e,t="request"){if(!e||typeof e!="object")return;let r=/^(wif|privateKey|secretKey|seed|mnemonic|signature|signatures|partialSig|partialSigs|signedPsbt|signedTransaction|rawTransaction|txHex|finalized|finalScriptSig|finalScriptWitness)$/i;for(let[i,s]of Object.entries(e))r.test(i)&&s!=null&&s!==!1&&n(`${t}.${i} refused; private, signed or finalized material is outside this prepare-only adapter`),H(s,`${t}.${i}`);for(let i of["sign","execute","broadcast","submit","adminBypass","bypass","unsafe"])e[i]===!0&&n(`${i} bypass refused; adapter is prepare-only`)}function M(e,t){for(let r of["script","scriptPubKey","scriptHex","redeemScript","witnessScript"])e?.[r]!=null&&n(`${t}.${r} arbitrary script refused; use a bound address`)}function q(e,t){(!e||typeof e!="object"||Array.isArray(e))&&n(`${t} must be an object`),M(e,t);let r=_(e.txid,`${t}.txid`),i=Number(e.vout);return(!Number.isSafeInteger(i)||i<0||i>4294967295)&&n(`${t}.vout invalid`),{txid:r,vout:i,valueSats:c(e.valueSats??e.value,`${t}.valueSats`,{positive:!0}).toString(),address:f(e.address,`${t}.address`),sequence:Number(c(e.sequence,`${t}.sequence`,{max:0xffffffffn})),outpoint:`${r}:${i}`}}function F(e,t){return(!e||typeof e!="object"||Array.isArray(e))&&n(`${t} must be an object`),M(e,t),{role:f(e.role,`${t}.role`),address:f(e.address,`${t}.address`),valueSats:c(e.valueSats??e.value,`${t}.valueSats`,{positive:!0}).toString(),...e.inscriptionId==null?{}:{inscriptionId:j(e.inscriptionId,`${t}.inscriptionId`)}}}function k(e,t,r){JSON.stringify(e)!==JSON.stringify(t)&&n(`${r} mismatch; mutation refused`)}function B(e={}){(!e||typeof e!="object"||Array.isArray(e))&&n("request object required"),H(e);let t=f(e.network,"network").toLowerCase(),r=_(e.genesisHash,"genesisHash");(!I[t]||r!==I[t])&&n("network/genesis mismatch");let i=j(e.inscriptionId),s=q(e.ownerInput,"ownerInput");f(e.currentOutpoint,"currentOutpoint").toLowerCase()!==s.outpoint&&n("current inscription outpoint mismatch");let x=f(e.destination,"destination"),h=c(e.postageSats??e.postage,"postageSats",{positive:!0}).toString(),a=e.changeOutput==null?null:F(e.changeOutput,"changeOutput");(a?.role!=="change"||a?.inscriptionId!=null)&&n("exact change output invalid");let u=v(e.feeRateSatVb,"feeRateSatVb"),d=v(e.maxFeeRateSatVb,"maxFeeRateSatVb");u>d&&n("fee rate exceeds reviewed cap");let l=c(e.totalFeeSats??e.feeSats,"totalFeeSats"),w=c(e.maxTotalFeeSats,"maxTotalFeeSats",{positive:!0});l>w&&n("total fee exceeds reviewed cap");let m=Number(c(e.locktime,"locktime",{max:0xffffffffn})),S=Number(c(e.sequence,"sequence",{max:0xffffffffn}));S<4294967294&&n("RBF sequence refused"),s.sequence!==S&&n("owner input sequence mismatch");let o=e.psbt;(!o||typeof o!="object"||Array.isArray(o))&&n("decoded PSBT plan required"),(o.version!==0||o.unsigned!==!0)&&n("PSBT v0 must be explicitly unsigned"),Number(o.locktime)!==m&&n("PSBT locktime mismatch"),(!Array.isArray(o.inputs)||o.inputs.length!==1)&&n("exactly one PSBT input required; extra inputs refused"),k(q(o.inputs[0],"psbt.inputs[0]"),s,"exact owner input");let p=Array.isArray(o.outputs)?o.outputs.map((b,y)=>F(b,`psbt.outputs[${y}]`)):n("PSBT outputs required"),g={role:"inscription",address:x,valueSats:h,inscriptionId:i};k(p,a?[g,a]:[g],"exact PSBT outputs"),p.filter(b=>b.role==="inscription"&&b.inscriptionId===i).length!==1&&n("exactly one inscription-carrying output required");let C=p.reduce((b,y)=>b+BigInt(y.valueSats),0n);return BigInt(s.valueSats)!==C+l&&n("input/output/fee conservation mismatch; inscription burn or fee widening refused"),{network:t,genesisHash:r,inscriptionId:i,currentOutpoint:s.outpoint,ownerInput:s,destination:x,postageSats:h,changeOutput:a,feeRateSatVb:u,maxFeeRateSatVb:d,totalFeeSats:l.toString(),maxTotalFeeSats:w.toString(),locktime:m,sequence:S,psbt:{version:0,unsigned:!0,locktime:m,inputs:[s],outputs:p}}}function R(e={},t={}){let r=B(e);return T({provider:P,kind:E,execution:"prepare-only",prepareOnly:!0,signed:!1,finalized:!1,broadcast:!1,capabilities:{...U},fee:{oracleFeeBps:0,oracleFeeSats:"0"},plan:{version:1,...r}},{provider:P,kind:E,env:t.env})}function X(e){return(!e||typeof e!="object")&&n("prepared plan required"),e.prepareHash!==A(e)&&n("prepareHash mismatch; plan was altered"),(e.provider!==P||e.kind!==E||e.oraclePrepared!==!0)&&n("invalid prepared identity"),(e.executionReady!==!1||e.signingReady!==!1||e.broadcastReady!==!1||e.signed!==!1||e.finalized!==!1||e.broadcast!==!1)&&n("executable, signed or finalized mutation refused"),(e.fee?.oracleFeeBps!==0||e.fee?.oracleFeeSats!=="0")&&n("NFT Oracle fee must be zero"),B(e.plan),!0}var te=R,re=R,ne=R,ie=X;function se(){n("signing refused; adapter is prepare-only")}function oe(){n("finalization refused; adapter is prepare-only")}function ae(){n("broadcast refused; adapter is prepare-only")}export{I as BITCOIN_GENESIS_HASHES,E as ORDINALS_TRANSFER_KIND,P as ORDINALS_TRANSFER_PROVIDER,X as assertOrdinalsTransferPlan,ae as ordinalsTransferBroadcast,oe as ordinalsTransferFinalize,se as ordinalsTransferSign,R as prepareOrdinalsTransfer,re as prepareOrdinalsTransferAdmin,te as prepareOrdinalsTransferPublic,ne as prepareUniversalOrdinalsTransfer,ie as validateOrdinalsTransferPlan,B as validateOrdinalsTransferRequest};
@@ -0,0 +1 @@
1
+ import{createHash as X,createHmac as J,timingSafeEqual as pe}from"node:crypto";var Z=2,Y=300*1e3,ee=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})();function N(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(N).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${N(e[t])}`).join(",")}}`}function I(e){let r=String(e?.ORACLE_STAMP_HMAC_SECRET||"").trim();return r.length>=16?r:""}function V(e=process.env){return I(process.env)||I(e)}function te(e){let{prepareHash:r,prepareMac:t,note:o,...i}=e||{};return i}function F(e){let r=te(e);return X("sha256").update(N(r)).digest("hex")}function re(e,r=V()){return r?J("sha256",r).update(String(e)).digest("hex"):""}function D(e,{provider:r,kind:t,env:o=process.env,nowMs:i=Date.now(),expiresAtMs:f}={}){if(!e||typeof e!="object")throw new Error("stampPrepared: payload object required");let k=Object.prototype.hasOwnProperty.call(e,"oraclePrepared");if(k&&typeof e.oraclePrepared!="boolean")throw new Error("stampPrepared: oraclePrepared must be boolean");let A={...e,provider:e.provider||r,kind:e.kind||t,requiresUserSignature:e.requiresUserSignature!==!1,signingReady:!1,broadcastReady:!1,executionReady:!1,oraclePrepared:k?e.oraclePrepared:!0};if(!A.provider)throw new Error("stampPrepared: provider required");if(!A.kind)throw new Error("stampPrepared: kind required");let p=Number(i),m=f==null?p+Y:Number(f),l=m-p;if(!Number.isSafeInteger(p)||!Number.isSafeInteger(m)||l<=0||l>ee)throw new Error("stampPrepared: bounded preparedAt/expiresAt required");let h={...A,preparedAt:p,expiresAt:m,prepareVersion:Z},x=F(h),b=V(o),g=b?re(x,b):void 0,S={...h,prepareHash:x};return g&&(S.prepareMac=g),S}var R="universal-solana-nft-transfer",q="solana-verified-nft-transfer",G="5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",w=Object.freeze({core:"CoREENxT6tW1HoK8ypY1SxRMZTcVPm7R94rH4PZNhX7d",tokenMetadata:"metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s",token:"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",token2022:"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb",associatedToken:"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL",computeBudget:"ComputeBudget111111111111111111111111111111"}),Q=new Set(Object.values(w)),ne=new Set([w.token,w.token2022]),oe=Object.freeze({prepare:!0,transferVerifiedNft:!0,sign:!1,broadcast:!1,custody:!1}),ie=/^(privateKey|secretKey|seed|mnemonic|signature|signatures|signed|signedTransaction|rawTransaction|rawTx|serializedTransaction|keypair)$/i;function n(e){throw new Error(`solana nft transfer: ${e}`)}function u(e,r){let t=String(e??"").trim();return t||n(`${r} required`),t}function d(e,r,{positive:t=!1}={}){/^\d+$/.test(String(e??""))||n(`${r} must be an unsigned integer`);let o=BigInt(e);return t&&o===0n&&n(`${r} must be positive`),o}function c(e,r,t){String(e??"")!==String(r)&&n(`${t} mismatch; mutation refused`)}function C(e,r="request",t=new Set){if(!(!e||typeof e!="object"||t.has(e))){t.add(e);for(let[o,i]of Object.entries(e))ie.test(o)&&i!=null&&i!==!1&&n(`${r}.${o} refused; signed or private material is outside this prepare-only adapter`),C(i,`${r}.${o}`,t);for(let o of["sign","execute","broadcast","submit","adminBypass","bypass","unsafe"])e[o]===!0&&n(`${o} refused; adapter is prepare-only`)}}function ae(e,r){return(!e?.decoded||typeof e.decoded!="object"||Array.isArray(e.decoded))&&n(`${r} must be decoded`),Array.isArray(e.accounts)||n(`${r} decoded accounts required`),e.decoded}function ce(e,r,t){for(let o of e.accounts){let i=u(o.pubkey,"account pubkey");r.has(i)||n(`unexpected account ${i}`),o.isWritable===!0&&!t.has(i)&&n(`unexpected writable account ${i}`)}}function K(e={}){(!e||typeof e!="object"||Array.isArray(e))&&n("request object required"),C(e),(e.network!=="mainnet-beta"||e.genesisHash!==G)&&n("mainnet genesis/network mismatch"),e.reviewed!==!0&&n("reviewed=true required for network, NFT, collection, parties, quantity, programs, blockhash and fees");let r=u(e.standard,"standard").toLowerCase();r!=="metaplex"&&r!=="core"&&n("standard must be metaplex or core");let t=u(e.mint??e.asset,"mint/asset"),o=u(e.collection,"collection");e.collectionVerified!==!0&&n("verified collection required");let i=u(e.owner,"owner"),f=u(e.recipient,"recipient"),k=d(e.quantity,"quantity",{positive:!0}),A=d(e.maxEditionQuantity??1,"maxEditionQuantity",{positive:!0});k>A&&n("quantity exceeds reviewed edition bound"),r==="core"&&k!==1n&&n("Core quantity must be exactly 1");let p=u(e.tokenProgramId,"tokenProgramId");(r==="core"?p!==w.core:!ne.has(p))&&n("reviewed transfer program mismatch");let m=r==="metaplex"?u(e.sourceTokenAccount,"sourceTokenAccount"):null,l=r==="metaplex"?u(e.recipientTokenAccount,"recipientTokenAccount"):null;r==="metaplex"&&c(e.derivedRecipientAta,l,"derived recipient ATA");let E=r==="metaplex"?Number(d(e.decimals??0,"decimals")):null,h=d(e.computeUnitLimit,"computeUnitLimit",{positive:!0}),x=d(e.computeUnitPriceMicroLamports,"computeUnitPriceMicroLamports"),b=d(e.priorityFeeCapLamports,"priorityFeeCapLamports"),g=(h*x+999999n)/1000000n;g>b&&n("priority fee exceeds reviewed cap");let S=d(e.networkFeeLamports,"networkFeeLamports"),B=d(e.networkFeeCapLamports,"networkFeeCapLamports");S>B&&n("network fee cap exceeded");let s=e.transaction;(!s||typeof s!="object"||Array.isArray(s))&&n("transaction object required"),s.version!==0&&s.version!=="legacy"&&n("transaction version must be 0 or legacy");let $=u(s.recentBlockhash,"recentBlockhash");c($,e.approvedBlockhash,"blockhash mutation after approval");let H=d(s.lastValidBlockHeight,"lastValidBlockHeight",{positive:!0}),M=d(e.currentBlockHeight,"currentBlockHeight");M>H&&n("expired blockhash"),(!Array.isArray(s.instructions)||s.instructions.length<3)&&n("canonical instructions required");let W=new Set([i,t,m,l].filter(Boolean)),z=new Set([i,f,t,o,m,l,...Q].filter(Boolean)),_=0,O=0,L=0,U=0;for(let[j,v]of s.instructions.entries()){let y=u(v.programId,`instructions[${j}].programId`);Q.has(y)||n(`unknown program ${y}`);let a=ae(v,`instructions[${j}]`);ce(v,z,W);let P=String(a.type??a.instruction??"").toLowerCase();y===w.computeBudget?P.includes("limit")?(c(a.units??a.computeUnitLimit,h,"compute-unit limit"),_++):P.includes("price")?(c(a.microLamports??a.computeUnitPriceMicroLamports,x,"compute-unit price"),O++):n("unsupported compute budget instruction"):y===w.associatedToken?((r!=="metaplex"||P!=="createassociatedtokenaccountidempotent")&&n("non-canonical associated token instruction"),c(a.payer,i,"ATA payer"),c(a.owner,f,"ATA recipient"),c(a.mint,t,"ATA mint"),c(a.tokenAccount,l,"recipient ATA"),c(a.tokenProgramId,p,"ATA token program"),U++):r==="metaplex"&&y===p?(P!=="transferchecked"&&n("only canonical transferChecked is allowed"),c(a.mint,t,"mint"),c(a.owner,i,"owner"),c(a.recipient,f,"recipient"),c(a.sourceTokenAccount,m,"source token account"),c(a.destinationTokenAccount,l,"recipient ATA"),c(a.amount,k,"quantity"),c(a.decimals,E,"decimals"),L++):r==="core"&&y===w.core?(P!=="transfer"&&n("only canonical Core transfer is allowed"),c(a.asset,t,"mint/asset"),c(a.collection,o,"collection"),a.collectionVerified!==!0&&n("verified collection required in Core instruction"),c(a.owner,i,"owner"),c(a.newOwner,f,"recipient"),c(a.amount??1,1,"quantity"),L++):n(`program ${y} is not valid for ${r} transfer`)}return(_!==1||O!==1)&&n("exactly one compute-unit limit and price instruction required"),L!==1&&n("exactly one canonical transfer instruction required"),r==="metaplex"&&U>1&&n("at most one idempotent recipient ATA instruction allowed"),{standard:r,mint:t,collection:o,owner:i,recipient:f,quantity:k.toString(),maxEditionQuantity:A.toString(),tokenProgramId:p,sourceTokenAccount:m,recipientTokenAccount:l,decimals:E,recentBlockhash:$,lastValidBlockHeight:H.toString(),currentBlockHeight:M.toString(),computeUnitLimit:h.toString(),computeUnitPriceMicroLamports:x.toString(),priorityFeeLamports:g.toString(),priorityFeeCapLamports:b.toString(),networkFeeLamports:S.toString(),networkFeeCapLamports:B.toString(),transaction:s}}function T(e={},r={}){let t=K(e),o=Number(r.nowMs??Date.now()),i={provider:R,kind:q,chain:"solana-mainnet-beta",genesisHash:G,execution:"prepare-only",prepareOnly:!0,signed:!1,broadcast:!1,requiresUserSignature:!0,executionReady:!1,signingReady:!1,broadcastReady:!1,oraclePrepared:!0,capabilities:{...oe},fee:{oracleFeeBps:0,oracleFeeLamports:"0"},transfer:{standard:t.standard,mint:t.mint,collection:t.collection,collectionVerified:!0,owner:t.owner,recipient:t.recipient,quantity:t.quantity,maxEditionQuantity:t.maxEditionQuantity,tokenProgramId:t.tokenProgramId,...t.sourceTokenAccount?{sourceTokenAccount:t.sourceTokenAccount,recipientTokenAccount:t.recipientTokenAccount,decimals:t.decimals}:{}},transaction:{unsigned:!0,version:t.transaction.version,recentBlockhash:t.recentBlockhash,lastValidBlockHeight:t.lastValidBlockHeight,instructions:structuredClone(t.transaction.instructions)},caps:{currentBlockHeight:t.currentBlockHeight,computeUnitLimit:t.computeUnitLimit,computeUnitPriceMicroLamports:t.computeUnitPriceMicroLamports,priorityFeeLamports:t.priorityFeeLamports,priorityFeeCapLamports:t.priorityFeeCapLamports,networkFeeLamports:t.networkFeeLamports,networkFeeCapLamports:t.networkFeeCapLamports},reviewed:!0};return D(i,{provider:R,kind:q,env:r.env,nowMs:o,expiresAtMs:o+300*1e3})}function se(e,{nowMs:r=Date.now()}={}){(!e||typeof e!="object")&&n("prepared envelope required"),C(e,"prepared"),e.prepareHash!==F(e)&&n("prepareHash mismatch; payload was altered"),(e.provider!==R||e.kind!==q||e.oraclePrepared!==!0)&&n("envelope identity mutation refused"),(e.execution!=="prepare-only"||e.prepareOnly!==!0||e.signed!==!1||e.broadcast!==!1||e.executionReady!==!1||e.signingReady!==!1||e.broadcastReady!==!1)&&n("execution state mutation refused"),(e.fee?.oracleFeeBps!==0||e.fee?.oracleFeeLamports!=="0")&&n("NFT Oracle fee mutation refused"),Number(r)>Number(e.expiresAt)&&n("prepared envelope expired");let t=e.transfer||{},o=e.caps||{},i=e.transaction||{};return K({network:"mainnet-beta",genesisHash:e.genesisHash,standard:t.standard,mint:t.mint,collection:t.collection,collectionVerified:t.collectionVerified,owner:t.owner,recipient:t.recipient,quantity:t.quantity,maxEditionQuantity:t.maxEditionQuantity,tokenProgramId:t.tokenProgramId,sourceTokenAccount:t.sourceTokenAccount,recipientTokenAccount:t.recipientTokenAccount,derivedRecipientAta:t.recipientTokenAccount,decimals:t.decimals,approvedBlockhash:i.recentBlockhash,currentBlockHeight:o.currentBlockHeight,computeUnitLimit:o.computeUnitLimit,computeUnitPriceMicroLamports:o.computeUnitPriceMicroLamports,priorityFeeCapLamports:o.priorityFeeCapLamports,networkFeeLamports:o.networkFeeLamports,networkFeeCapLamports:o.networkFeeCapLamports,reviewed:e.reviewed,transaction:i}),!0}var fe=T,me=T,ke=T,ye=T,we=T,Ae=se;function he(){n("signing refused; adapter is prepare-only")}function xe(){n("broadcast refused; adapter is prepare-only")}export{G as SOLANA_MAINNET_GENESIS,q as SOLANA_NFT_TRANSFER_KIND,w as SOLANA_NFT_TRANSFER_PROGRAMS,R as SOLANA_NFT_TRANSFER_PROVIDER,se as assertSolanaNftTransfer,ke as prepareSolanaNftTransfer,we as prepareSolanaNftTransferAdmin,ye as prepareSolanaNftTransferPublic,T as prepareUniversalSolanaNftTransfer,me as prepareUniversalSolanaNftTransferAdmin,fe as prepareUniversalSolanaNftTransferPublic,xe as solanaNftTransferBroadcast,he as solanaNftTransferSign,Ae as validateSolanaNftTransfer,K as validateSolanaNftTransferRequest};