@hivemindhq/snap 1.3.0 → 1.4.0
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 +46 -15
- package/dist/bundle.js +1 -1
- package/package.json +6 -5
- package/snap.manifest.json +2 -2
package/README.md
CHANGED
|
@@ -9,9 +9,9 @@ When you're about to send a transaction to an address, the Hive Mind Snap shows
|
|
|
9
9
|
- **Trust Signals** — How many people have staked that the address is trustworthy (or not)
|
|
10
10
|
- **Aliases** — Community-assigned labels for the address
|
|
11
11
|
- **Stake Amounts** — The economic weight behind each trust signal
|
|
12
|
-
- **Your Position** —
|
|
12
|
+
- **Your Position** — Your own trust/distrust stake displayed prominently as the strongest signal
|
|
13
13
|
- **dApp Origin Trust** — Trust data for the dApp you're interacting with
|
|
14
|
-
- **
|
|
14
|
+
- **Your Trust Circle** — See which of your trusted contacts have staked on this address (sorted by stake)
|
|
15
15
|
|
|
16
16
|
This helps you make informed decisions before interacting with unknown addresses or dApps.
|
|
17
17
|
|
|
@@ -20,23 +20,24 @@ This helps you make informed decisions before interacting with unknown addresses
|
|
|
20
20
|
| Feature | Description |
|
|
21
21
|
|---------|-------------|
|
|
22
22
|
| **Transaction Insights** | `onTransaction` hook displays trust data before you sign |
|
|
23
|
+
| **Your Position** | Prominently displays your own trust/distrust stake as the strongest signal |
|
|
23
24
|
| **Trust Triple Display** | Shows support/oppose positions on `[address] has tag trustworthy` |
|
|
24
25
|
| **dApp Origin Trust** | Shows trust data for the dApp origin (transaction source) |
|
|
25
|
-
| **
|
|
26
|
+
| **Your Trust Circle** | Highlights when your trusted contacts have staked on an address (sorted by stake) |
|
|
26
27
|
| **Distribution Analysis** | Analyzes stake distribution health (concentrated vs. distributed) |
|
|
27
28
|
| **Alias Display** | Shows community-assigned aliases for addresses |
|
|
28
29
|
| **Multi-chain Support** | Works on Intuition Testnet (chain ID: 13579) and Mainnet (chain ID: 1155) |
|
|
29
30
|
| **Interactive UI** | Links to create trust signals or view more data on the web |
|
|
30
|
-
| **Persistent Cache** |
|
|
31
|
+
| **Persistent Cache** | Trust circle cached for 1 hour for optimal performance |
|
|
31
32
|
|
|
32
33
|
## Installation
|
|
33
34
|
|
|
34
|
-
### From npm
|
|
35
|
+
### From npm
|
|
35
36
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
37
|
+
The Snap is published to npm and can be installed directly through MetaMask:
|
|
38
|
+
|
|
39
|
+
- **Package name**: `@hivemindhq/snap`
|
|
40
|
+
- **npm**: https://www.npmjs.com/package/@hivemindhq/snap
|
|
40
41
|
|
|
41
42
|
### For Development
|
|
42
43
|
|
|
@@ -141,7 +142,8 @@ src/
|
|
|
141
142
|
├── components/ # JSX UI components
|
|
142
143
|
│ ├── Account.tsx # Destination address display
|
|
143
144
|
│ ├── Origin.tsx # dApp origin display
|
|
144
|
-
│ ├── TrustedCircle.tsx #
|
|
145
|
+
│ ├── TrustedCircle.tsx # Trust circle display
|
|
146
|
+
│ ├── UserPosition.tsx # User's own position display
|
|
145
147
|
│ ├── UnifiedFooter.tsx # Combined footer CTAs
|
|
146
148
|
│ ├── Footer/ # Account footer actions
|
|
147
149
|
│ └── OriginFooter/ # Origin footer actions
|
|
@@ -166,11 +168,40 @@ Chain settings are defined in `src/config.ts`:
|
|
|
166
168
|
|
|
167
169
|
The Snap queries the Intuition knowledge graph using these predefined atoms:
|
|
168
170
|
|
|
169
|
-
| Atom | Purpose |
|
|
170
|
-
|
|
171
|
-
| `hasTag` | Predicate for trust triples |
|
|
172
|
-
| `trustworthy` | The "trustworthy" characteristic |
|
|
173
|
-
| `hasAlias` | Predicate for alias relationships |
|
|
171
|
+
| Atom Name | Atom ID (term_id) | Purpose |
|
|
172
|
+
|-----------|-------------------|---------|
|
|
173
|
+
| `hasTag` | `0x6de69cc0ae3efe4000279b1bf365065096c8715d8180bc2a98046ee07d3356fd` | Predicate for trust triples |
|
|
174
|
+
| `trustworthy` | `0xe9c0e287737685382bd34d51090148935bdb671c98d20180b2fec15bd263f73a` | The "trustworthy" characteristic |
|
|
175
|
+
| `hasAlias` | `0xf8cfb4e3f1db08f72f255cf7afaceb4b32684a64dac0f423cdca04dd15cf4fd6` | Predicate for alias relationships |
|
|
176
|
+
|
|
177
|
+
**Note**: These atom IDs are the same on both Intuition Testnet and Mainnet, as atoms are chain-agnostic identifiers in the Intuition protocol.
|
|
178
|
+
|
|
179
|
+
### Community & Distribution Indicators
|
|
180
|
+
|
|
181
|
+
The Snap displays two key indicators to help users assess trust signals:
|
|
182
|
+
|
|
183
|
+
#### Community (Trust Level)
|
|
184
|
+
|
|
185
|
+
Based on FOR vs AGAINST market cap ratio:
|
|
186
|
+
|
|
187
|
+
| Badge | Threshold |
|
|
188
|
+
|-------|-----------|
|
|
189
|
+
| **Trusted** 🟢 | ≥70% FOR |
|
|
190
|
+
| **Mixed** 🟡 | 30-70% FOR |
|
|
191
|
+
| **Untrusted** 🟡 | <30% FOR |
|
|
192
|
+
|
|
193
|
+
#### Distribution Status
|
|
194
|
+
|
|
195
|
+
Uses Gini coefficient + top-1 concentration:
|
|
196
|
+
|
|
197
|
+
| Status | Criteria |
|
|
198
|
+
|--------|----------|
|
|
199
|
+
| **Distributed** 🟢 | Gini ≤0.35 and top holder <30% |
|
|
200
|
+
| **Moderate** 🟡 | Gini 0.35-0.55 |
|
|
201
|
+
| **Concentrated** ⚠️ | Gini 0.55-0.75 or top holder 50-80% |
|
|
202
|
+
| **Whale** ⛔️ | Top holder ≥80% (always triggers) |
|
|
203
|
+
|
|
204
|
+
*Minimum 3 stakers needed for meaningful Gini analysis.*
|
|
174
205
|
|
|
175
206
|
## Building
|
|
176
207
|
|
package/dist/bundle.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
(()=>{"use strict";var t={d:(e,n)=>{for(var r in n)t.o(n,r)&&!t.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:n[r]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},e={};function n(t,e,n){if("string"==typeof t)throw new Error(`An HTML element ("${String(t)}") was used in a Snap component, which is not supported by Snaps UI. Please use one of the supported Snap components.`);if(!t)throw new Error("A JSX fragment was used in a Snap component, which is not supported by Snaps UI. Please use one of the supported Snap components.");return t({...e,key:n})}function r(t,e,r){return n(t,e,r)}function i(t){return Object.fromEntries(Object.entries(t).filter((([,t])=>void 0!==t)))}function o(t){return e=>{const{key:n=null,...r}=e;return{type:t,props:i(r),key:n}}}t.r(e),t.d(e,{onHomePage:()=>bt,onTransaction:()=>gt,onUserInput:()=>ft});const a=o("Box"),s=o("Heading"),l=o("Text"),c=o("Divider"),d=o("Link"),u={backendUrl:"https://mainnet.intuition.sh/v1/graphql",rpcUrl:"https://rpc.intuition.systems",chainId:1155,chainIdHex:"0x483",chainName:"Intuition Mainnet",chainKey:"intuition-mainnet",currencySymbol:"TRUST",decimalPrecision:18,hasTagAtomId:"0x6de69cc0ae3efe4000279b1bf365065096c8715d8180bc2a98046ee07d3356fd",trustworthyAtomId:"0xe9c0e287737685382bd34d51090148935bdb671c98d20180b2fec15bd263f73a",hasAliasAtomId:"0xf8cfb4e3f1db08f72f255cf7afaceb4b32684a64dac0f423cdca04dd15cf4fd6"},p=u,h=async(t,e)=>{const n=await fetch(p.backendUrl,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({query:t,variables:e})});if(!n.ok)throw new Error(`GraphQL request failed: ${n.status} ${n.statusText}`);const r=await n.json();if(r.errors&&r.errors.length>0)throw new Error(`GraphQL error: ${r.errors[0].message}`);return r},m='\nquery TripleWithPositionAggregates($subjectId: String!, $predicateId: String!, $objectId: String!, $userAddress: String!) {\n triples(where: {\n subject_id: { _eq: $subjectId },\n predicate_id: { _eq: $predicateId },\n object_id: { _eq: $objectId }\n }) {\n term_id\n subject_id\n predicate_id\n object_id\n creator_id\n counter_term_id\n\n # Main vault (support) market data\n term {\n vaults(where: { curve_id: { _eq: "1" } }) {\n term_id\n market_cap\n position_count\n curve_id\n }\n }\n\n # Counter vault (oppose) market data\n counter_term {\n vaults(where: { curve_id: { _eq: "1" } }) {\n term_id\n market_cap\n position_count\n curve_id\n }\n }\n\n # Triple-specific aggregated market data\n triple_term {\n term_id\n counter_term_id\n total_market_cap\n total_position_count\n }\n\n # Detailed triple vault data per curve\n triple_vault {\n term_id\n counter_term_id\n curve_id\n position_count\n market_cap\n }\n\n positions_aggregate {\n aggregate {\n count\n sum {\n shares\n }\n avg {\n shares\n }\n }\n }\n\n counter_positions_aggregate {\n aggregate {\n count\n sum {\n shares\n }\n avg {\n shares\n }\n }\n }\n\n positions(\n order_by: { shares: desc }\n limit: 30\n ) {\n id\n account_id\n term_id\n curve_id\n shares\n account {\n id\n label\n }\n }\n\n counter_positions(\n order_by: { shares: desc }\n limit: 30\n ) {\n id\n account_id\n term_id\n curve_id\n shares\n account {\n id\n label\n }\n }\n\n # User\'s specific position (if any)\n user_position: positions(where: { account_id: { _ilike: $userAddress } }) {\n account_id\n shares\n }\n\n # User\'s specific counter-position (if any)\n user_counter_position: counter_positions(where: { account_id: { _ilike: $userAddress } }) {\n account_id\n shares\n }\n }\n chainlink_prices(limit: 1, order_by: { id: desc }) {\n usd\n }\n backup_chainlink_prices: chainlink_prices(\n limit: 1,\n order_by: { id: desc },\n where: { usd: { _is_null: false } }\n ) {\n usd\n }\n}\n',_="\nquery OriginAtom($originUrl: String!) {\n atoms(\n where: {\n _or: [\n { label: { _ilike: $originUrl } },\n { data: { _ilike: $originUrl } }\n ]\n },\n order_by: { term: { total_market_cap: desc_nulls_last } },\n limit: 1\n ) {\n term_id\n type\n label\n image\n data\n emoji\n creator_id\n }\n}\n",g="\nquery UserTrustedCircle($userAddress: String!, $predicateId: String!, $objectId: String!) {\n positions(\n where: {\n account_id: { _ilike: $userAddress },\n term: {\n triple: {\n predicate_id: { _eq: $predicateId },\n object_id: { _eq: $objectId }\n }\n }\n },\n order_by: { shares: desc },\n limit: 200\n ) {\n term {\n triple {\n subject_id\n subject {\n label\n data\n }\n }\n }\n }\n}\n";var f,b;!function(t){t.NoAtom="NoAtom",t.AtomWithoutTrustTriple="AtomWithoutTrustTriple",t.AtomWithTrustTriple="AtomWithTrustTriple"}(f||(f={})),function(t){t.NoOrigin="NoOrigin",t.NoAtom="OriginNoAtom",t.AtomWithoutTrustTriple="OriginAtomWithoutTrustTriple",t.AtomWithTrustTriple="OriginAtomWithTrustTriple"}(b||(b={}));const v=(t,e)=>`caip10:${e}:${t}`,w=(t,e)=>{const n=BigInt(t),r=BigInt(10**e),i=n/r,o=(n%r).toString().padStart(e,"0").slice(0,6);return Number(`${i}.${o}`)},y=o("Section"),T=o("Row"),A=o("Address"),C=o("Bold"),I=o("Value"),S={"well-distributed":"success",moderate:"warning",concentrated:"warning","whale-dominated":"warning"},$={"well-distributed":"#22c55e",moderate:"#eab308",concentrated:"#f97316","whale-dominated":"#ef4444"},k={"well-distributed":"Well Distributed",moderate:"Moderate",concentrated:"Concentrated","whale-dominated":"Whale Dominated"},j={"well-distributed":"🟢 Distributed",moderate:"🟡 Moderate",concentrated:"⚠️ Concentrated","whale-dominated":"⛔️ Whale"};function P(t,e){const n=t.filter((t=>t>0));if(0===n.length)return 0;const r=n.reduce(((t,e)=>t+e),0);if(0===r)return 0;return[...n].sort(((t,e)=>e-t)).slice(0,e).reduce(((t,e)=>t+e),0)/r*100}const N={gini:{wellDistributed:.35,moderate:.55,concentrated:.75},top1:{wellDistributed:30,moderate:50,concentrated:80},minStakersForAnalysis:3};function O(t,e,n){const{gini:r,top1:i,minStakersForAnalysis:o}=N;return e>=i.concentrated?"whale-dominated":n<o?e>=i.moderate?"concentrated":0===n?"well-distributed":"moderate":t<=r.wellDistributed?"well-distributed":t<=r.moderate?"moderate":t<=r.concentrated?"concentrated":"whale-dominated"}function W(t){const e=t.filter((t=>t>0)),n=e.length,r=e.reduce(((t,e)=>t+e),0);if(0===n){const t="well-distributed";return{gini:0,nakamoto:0,top1Percent:0,top3Percent:0,stakerCount:0,totalShares:0,status:t,snapColor:S[t],hexColor:$[t],label:"No Stakes",shortLabel:"None"}}const i=function(t){const e=t.filter((t=>t>0)),n=e.length;if(0===n)return 0;if(1===n)return 0;const r=e.reduce(((t,e)=>t+e),0)/n;if(0===r)return 0;let i=0;for(let t=0;t<n;t++)for(let r=0;r<n;r++){const n=e[t],o=e[r];void 0!==n&&void 0!==o&&(i+=Math.abs(n-o))}const o=i/(2*n*n*r);return Math.max(0,Math.min(1,o))}(e),o=function(t){const e=t.filter((t=>t>0));if(0===e.length)return 0;const n=.51*e.reduce(((t,e)=>t+e),0),r=[...e].sort(((t,e)=>e-t));let i=0;for(let t=0;t<r.length;t++){const e=r[t];if(void 0!==e&&(i+=e,i>=n))return t+1}return r.length}(e),a=P(e,1),s=P(e,3),l=O(i,a,n);return{gini:i,nakamoto:o,top1Percent:a,top3Percent:s,stakerCount:n,totalShares:r,status:l,snapColor:S[l],hexColor:$[l],label:k[l],shortLabel:j[l]}}function x(t){return W(t.map((t=>t.shares)).filter((t=>!isNaN(t)&&t>0)))}function U(t){var e,n;if(!t||0===t.count)return W([]);const{count:r,sum:i,avg:o}=t,a=(null===(e=i)||void 0===e?void 0:e.shares)||0;null===(n=o)||void 0===n||n.shares;if(0===r||0===a)return W([]);let s,l;s=1===r?100:2===r?70:r<=5?100/Math.sqrt(r):Math.max(20,100/Math.pow(r,.7)),l=1===r?0:2===r?.5:r<=5?.6:r<=10?.5:.4;const c=O(l,s,r);return{gini:l,nakamoto:1===r?1:Math.ceil(.3*r),top1Percent:s,top3Percent:Math.min(100,1.3*s),stakerCount:r,totalShares:a,status:c,snapColor:S[c],hexColor:$[c],label:k[c],shortLabel:j[c]}}function L(t,e,n,r,i,o){const{level:a,ratio:s}=function(t,e){const n=t+e;if(0===n)return{level:"no-stakes",ratio:50};const r=t/n*100;return r>=70?{level:"trusted",ratio:r}:r>=30?{level:"mixed",ratio:r}:{level:"untrusted",ratio:r}}(t,e),l=n&&n.length>0?x(n):U(i),c=r&&r.length>0?x(r):U(o),d=function(t,e){const n=["well-distributed","moderate","concentrated","whale-dominated"];return n.indexOf(t)>=n.indexOf(e)?t:e}(l.status,c.status);return{trustLevel:a,trustRatio:s,forDistribution:l,againstDistribution:c,overallDistribution:d,overallSnapColor:S[d]}}function q(t){if(0===t.length)return"";const e=t.slice(0,3).map((t=>function(t){if(/^0x[a-fA-F0-9]{40}$/u.test(t))return`${t.slice(0,6)}...${t.slice(-4)}`;if(t.startsWith("caip10:")){const e=t.split(":"),n=e[e.length-1];if(n&&/^0x[a-fA-F0-9]{40}$/u.test(n))return`${n.slice(0,6)}...${n.slice(-4)}`}return t}(t.label)));if(t.length>3){const n=t.length-3;return`${e.join(", ")} +${n} more`}return e.join(", ")}const D=({forContacts:t,againstContacts:e})=>0===t.length&&0===e.length?null:r(y,{children:[n(s,{size:"sm",children:"Your Trust Circle"}),t.length>0&&n(T,{label:"FOR",children:n(l,{color:"success",children:n(C,{children:q(t)})})}),e.length>0&&n(T,{label:"AGAINST",children:n(l,{color:"warning",children:n(C,{children:q(e)})})})]});function M(t){const e=BigInt(t),n=p.decimalPrecision,r=BigInt(10**n),i=e/r,o=e%r*100n/r;return`${o>0?`${i}.${o.toString().padStart(2,"0")}`:i.toString()} ${p.currencySymbol}`}const F=({userPosition:t,userCounterPosition:e})=>{var i,o;const a=null===(i=t)||void 0===i?void 0:i[0],c=null===(o=e)||void 0===o?void 0:o[0];return a||c?r(y,{children:[n(s,{size:"sm",children:"Your Position"}),a?n(T,{label:"You TRUST",children:n(l,{color:"success",children:n(C,{children:M(a.shares)})})}):null,c?n(T,{label:"You DISTRUST",children:n(l,{color:"warning",children:n(C,{children:M(c.shares)})})}):null]}):null},R=()=>n(s,{size:"sm",children:"Destination"}),E=t=>t.map((t=>({shares:parseFloat(t.shares)||0}))),B=({alternateTrustData:t,isContract:e})=>{if(!t.hasAlternateTrustData)return null;const r=t.alternateIsCaip?`Also has data as a contract on ${p.chainName}`:"Also has data as an EOA";return n(l,{color:"default",children:r})},H={[f.NoAtom]:t=>{const{address:e,isContract:i,alternateTrustData:o}=t,a=i?"contract":"address";return r(y,{children:[n(R,{}),n(T,{label:"Address",children:n(A,{address:e})}),n(T,{label:"Status",variant:"warning",children:n(l,{color:"warning",children:r(C,{children:["Unknown ",a]})})}),n(l,{color:"default",children:"No community data on Intuition"}),n(B,{alternateTrustData:o,isContract:i})]})},[f.AtomWithoutTrustTriple]:t=>{const{address:e,account:i,alias:o,isContract:a,alternateTrustData:s}=t;return r(y,{children:[n(R,{}),n(T,{label:"Address",children:n(A,{address:e})}),!!o&&n(T,{label:"Alias",children:n(l,{children:n(C,{children:o})})}),n(T,{label:"Status",children:n(l,{color:"default",children:"No trust rating yet"})}),n(l,{color:"default",children:"Known address, awaiting community votes"}),n(B,{alternateTrustData:s,isContract:a})]})},[f.AtomWithTrustTriple]:t=>{var e,i,o,a,s,c;const{address:d,triple:u,alias:h,isContract:m,alternateTrustData:_,trustedCircle:g}=t,{counter_term:{vaults:[f]},term:{vaults:[b]},positions:v,counter_positions:S,positions_aggregate:$,counter_positions_aggregate:k,user_position:j,user_counter_position:P}=u,N=(null===(e=b)||void 0===e?void 0:e.market_cap)||"0",O=w(N,18),W=(null===(i=f)||void 0===i?void 0:i.market_cap)||"0",x=w(W,18),{badge:U,color:q}=((t,e)=>{const n=t+e;if(0===n)return{badge:"No Stakes",color:"muted"};const r=t/n*100;return r>=70?{badge:"Trusted",color:"success"}:r>=30?{badge:"Mixed",color:"warning"}:{badge:"Untrusted",color:"warning"}})(O,x),M=(t=>{const{forDistribution:e}=t,n=["success","warning","muted","default"].includes(e.snapColor)?e.snapColor:"default";return{label:e.shortLabel,color:n}})(L(O,x,E(v),E(S),null===(o=$)||void 0===o?void 0:o.aggregate,null===(a=k)||void 0===a?void 0:a.aggregate)),H=((null===(s=j)||void 0===s?void 0:s.length)??0)>0||((null===(c=P)||void 0===c?void 0:c.length)??0)>0;return r(y,{children:[n(R,{}),n(T,{label:"Address",children:n(A,{address:d})}),!!h&&n(T,{label:"Alias",children:n(l,{children:n(C,{children:h})})}),H&&n(F,{userPosition:j??[],userCounterPosition:P??[]}),n(T,{label:"Trust",children:n(l,{color:q,children:n(C,{children:U})})}),n(T,{label:"Distribution",children:n(l,{color:M.color,children:n(C,{children:M.label})})}),n(T,{label:`FOR (${v.length})`,children:n(I,{value:`${O.toFixed(2)} ${p.currencySymbol}`,extra:""})}),n(T,{label:`AGAINST (${S.length})`,children:n(I,{value:`${x.toFixed(2)} ${p.currencySymbol}`,extra:""})}),n(B,{alternateTrustData:_,isContract:m}),g?n(D,{forContacts:g.forContacts,againstContacts:g.againstContacts}):null]})}},J={1155:"https://explorer.hivemindhq.io",13579:"https://testnet.explorer.hivemindhq.io"}[p.chainId],V={name:"Hive Mind Explorer",noAtom:t=>{const{address:e,chainId:n,isContract:r}=t,i=r?v(e,n):e,o=new URL("/snap/action",J);return o.searchParams.set("intent","complete_trust_triple"),o.searchParams.set("address",i),o.searchParams.set("chain_id",n),{url:o.toString()}},atomWithoutTrustTriple:t=>{const{account:e}=t;if(!e)throw new Error("atomWithoutTrustTriple: account not found");const{term_id:n}=e,r=new URL("/snap/action",J);return r.searchParams.set("intent","create_trust_triple"),r.searchParams.set("atom_id",n),{url:r.toString()}},atomWithTrustTriple:t=>{const{triple:e}=t;if(!e)throw new Error("atomWithTrustTriple: triple not found");const{term_id:n}=e,r=new URL("/snap/action",J);return r.searchParams.set("intent","stake_trust_triple"),r.searchParams.set("triple_id",n),{url:r.toString()}},viewAtom:t=>{const{account:e}=t;if(!e)throw new Error("viewAtom: account not found");const{term_id:n}=e;return{url:new URL(`/atoms/${n}`,J).toString()}},createAlias:t=>{const{account:e}=t;if(!e)throw new Error("createAlias: account not found");const{term_id:n}=e,r=new URL("/snap/action",J);return r.searchParams.set("intent","create_alias"),r.searchParams.set("subject_id",n),{url:r.toString()}},originAtomWithoutTrustTriple:t=>{const{origin:e}=t;if(!e)throw new Error("originAtomWithoutTrustTriple: origin not found");const{term_id:n}=e,r=new URL("/snap/action",J);return r.searchParams.set("intent","create_trust_triple"),r.searchParams.set("atom_id",n),{url:r.toString()}},originAtomWithTrustTriple:t=>{const{triple:e}=t;if(!e)throw new Error("originAtomWithTrustTriple: triple not found");const{term_id:n}=e,r=new URL("/snap/action",J);return r.searchParams.set("intent","stake_trust_triple"),r.searchParams.set("triple_id",n),{url:r.toString()}},viewOriginAtom:t=>{const{origin:e}=t;if(!e)throw new Error("viewOriginAtom: origin not found");const{term_id:n}=e;return{url:new URL(`/atoms/${n}`,J).toString()}}},G=V,z=({href:t,label:e})=>n(a,{children:n(d,{href:t,children:e})}),Y=t=>{if(t.accountType!==f.NoAtom)return null;const{url:e}=G.noAtom(t);return n(z,{href:e,label:"Create trust claim"})},K=t=>{if(t.accountType===f.NoAtom)return null;if(t.accountType===f.AtomWithoutTrustTriple){const{url:e}=G.atomWithoutTrustTriple(t);return n(z,{href:e,label:"Is this address trustworthy? Vote"})}if(t.accountType===f.AtomWithTrustTriple){const{triple:e,userAddress:r}=t;if(!!r&&(e.positions.some((t=>{var e;return(null===(e=t.account_id)||void 0===e?void 0:e.toLowerCase())===r.toLowerCase()}))||e.counter_positions.some((t=>{var e;return(null===(e=t.account_id)||void 0===e?void 0:e.toLowerCase())===r.toLowerCase()}))))return null;const{url:i}=G.atomWithTrustTriple(t);return n(z,{href:i,label:"Is this address trustworthy? Vote"})}return null},Q=t=>{if(t.accountType===f.NoAtom)return null;if(t.alias)return null;const{url:e}=G.createAlias(t);return n(z,{href:e,label:"Add alias"})},X=t=>{if(t.accountType===f.NoAtom)return null;const{url:e}=G.viewAtom(t);return n(z,{href:e,label:"View more about this address"})},Z=()=>n(s,{size:"sm",children:"dApp Origin"}),tt=t=>t.map((t=>({shares:parseFloat(t.shares)||0}))),et={[b.NoOrigin]:t=>null,[b.NoAtom]:t=>{const{hostname:e}=t;return r(y,{children:[n(Z,{}),n(T,{label:"From",children:n(l,{children:n(C,{children:e||"Unknown"})})}),n(T,{label:"Status",variant:"warning",children:n(l,{color:"warning",children:n(C,{children:"Unknown dApp"})})}),n(l,{color:"default",children:"No community data. Proceed with caution."})]})},[b.AtomWithoutTrustTriple]:t=>{var e;const{hostname:i,origin:o}=t;return r(y,{children:[n(Z,{}),n(T,{label:"From",children:n(l,{children:n(C,{children:i||(null===(e=o)||void 0===e?void 0:e.label)||"Unknown"})})}),n(T,{label:"Status",children:n(l,{color:"default",children:"No trust rating yet"})}),n(l,{color:"default",children:"Known dApp, awaiting community votes"})]})},[b.AtomWithTrustTriple]:t=>{var e,i,o,a,s,c,d,u,h,m,_;const{hostname:g,origin:f,triple:b,trustedCircle:v}=t,A=null===(i=b.term)||void 0===i||null===(e=i.vaults)||void 0===e?void 0:e[0],S=null===(a=b.counter_term)||void 0===a||null===(o=a.vaults)||void 0===o?void 0:o[0],$=(null===(s=A)||void 0===s?void 0:s.market_cap)||"0",k=w($,18),j=(null===(c=S)||void 0===c?void 0:c.market_cap)||"0",P=w(j,18),N=(null===(d=b.positions)||void 0===d?void 0:d.length)||0,O=(null===(u=b.counter_positions)||void 0===u?void 0:u.length)||0,{badge:W,color:x}=((t,e)=>{const n=t+e;if(0===n)return{badge:"No Stakes",color:"muted"};const r=t/n*100;return r>=70?{badge:"Trusted",color:"success"}:r>=30?{badge:"Mixed",color:"warning"}:{badge:"Untrusted",color:"warning"}})(k,P),U=(t=>{const{forDistribution:e}=t,n=["success","warning","muted","default"].includes(e.snapColor)?e.snapColor:"default";return{label:e.shortLabel,color:n}})(L(k,P,tt(b.positions||[]),tt(b.counter_positions||[]))),{user_position:q,user_counter_position:M}=b,R=((null===(h=q)||void 0===h?void 0:h.length)??0)>0||((null===(m=M)||void 0===m?void 0:m.length)??0)>0;return r(y,{children:[n(Z,{}),n(T,{label:"From",children:n(l,{children:n(C,{children:g||(null===(_=f)||void 0===_?void 0:_.label)||"Unknown"})})}),R&&n(F,{userPosition:q??[],userCounterPosition:M??[]}),n(T,{label:"Trust",children:n(l,{color:x,children:n(C,{children:W})})}),n(T,{label:"Distribution",children:n(l,{color:U.color,children:n(C,{children:U.label})})}),n(T,{label:`FOR (${N})`,children:n(I,{value:`${k.toFixed(2)} ${p.currencySymbol}`,extra:""})}),n(T,{label:`AGAINST (${O})`,children:n(I,{value:`${P.toFixed(2)} ${p.currencySymbol}`,extra:""})}),v?n(D,{forContacts:v.forContacts,againstContacts:v.againstContacts}):null]})}},nt=t=>{if(t.originType===b.NoOrigin||t.originType===b.NoAtom)return null;if(t.originType===b.AtomWithoutTrustTriple){const{url:e}=G.originAtomWithoutTrustTriple(t);return n(z,{href:e,label:"Is this dApp trustworthy? Vote"})}if(t.originType===b.AtomWithTrustTriple){const{url:e}=G.originAtomWithTrustTriple(t);return n(z,{href:e,label:"Is this dApp trustworthy? Vote"})}return null},rt=t=>{if(t.originType===b.NoOrigin||t.originType===b.NoAtom)return null;const{url:e}=G.viewOriginAtom(t);return n(z,{href:e,label:"View more about this dApp"})},it=({accountProps:t,originProps:e})=>{const i=e.originType===b.AtomWithoutTrustTriple||e.originType===b.AtomWithTrustTriple;return r(a,{children:[n(c,{}),r(a,{children:[n(Y,{...t}),n(K,{...t}),n(Q,{...t}),n(X,{...t}),i&&n(nt,{...e}),i&&n(rt,{...e})]})]})},ot=t=>{var e,n,r,i,o,a;if(!t)return 0n;return BigInt((null===(r=t.term)||void 0===r||null===(n=r.vaults)||void 0===n||null===(e=n[0])||void 0===e?void 0:e.market_cap)??"0")+BigInt((null===(a=t.counter_term)||void 0===a||null===(o=a.vaults)||void 0===o||null===(i=o[0])||void 0===i?void 0:i.market_cap)??"0")},at=async(t,e,n)=>{const{to:r,data:i}=t,o=v(r,e),a=await(async(t,e)=>{if("0x"!==e)return{type:"contract",certainty:"definite"};try{const e=await fetch(p.rpcUrl,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",method:"eth_getCode",params:[t,"latest"],id:1})});if(!e.ok)return{type:"unknown",certainty:"uncertain",reason:"eth_getCode_failed"};const n=(await e.json()).result;return"0x"===n||null===n?{type:"eoa",certainty:"definite"}:{type:"contract",certainty:"definite"}}catch(t){return{type:"unknown",certainty:"uncertain",reason:"eth_getCode_failed"}}})(r,i),s="contract"===a.type||"uncertain"===a.certainty;try{var l,c,d;const[t]=await Promise.all([h("\nquery AddressAtoms($plainAddress: String!, $caipAddress: String!) {\n # Atoms matching plain address format (for EOAs)\n plainAtoms: atoms(\n where: {\n _or: [\n { label: { _ilike: $plainAddress } },\n { data: { _ilike: $plainAddress } }\n ]\n },\n order_by: { term: { total_market_cap: desc_nulls_last } },\n limit: 1\n ) {\n term_id\n type\n label\n image\n data\n emoji\n creator_id\n }\n\n # Atoms matching CAIP format (for smart contracts)\n caipAtoms: atoms(\n where: {\n _or: [\n { label: { _ilike: $caipAddress } },\n { data: { _ilike: $caipAddress } }\n ]\n },\n order_by: { term: { total_market_cap: desc_nulls_last } },\n limit: 1\n ) {\n term_id\n type\n label\n image\n data\n emoji\n creator_id\n }\n}\n",{plainAddress:r,caipAddress:o})]),{plainAtoms:e,caipAtoms:i}=t.data,g=null===(l=e)||void 0===l?void 0:l[0],f=null===(c=i)||void 0===c?void 0:c[0];if(!g&&!f)return{account:null,triple:null,isContract:s,alias:null,classification:a,alternateTrustData:{hasAlternateTrustData:!1}};const{hasTagAtomId:b,trustworthyAtomId:v,hasAliasAtomId:w}=p,y=[],T=[],A=n||"";g&&(y.push(h(m,{subjectId:g.term_id,predicateId:b,objectId:v,userAddress:A})),T.push("plain")),f&&(y.push(h(m,{subjectId:f.term_id,predicateId:b,objectId:v,userAddress:A})),T.push("caip"));const C=await Promise.all(y),I={};T.forEach(((t,e)=>{I[t]=C[e].data.triples[0]||null}));const S=((t,e,n,r,i)=>n||e?n?e?"definite"===t.certainty?"contract"===t.type?{primary:n,primaryTriple:i,alternate:e,alternateTriple:r,usedCaip:!0}:{primary:e,primaryTriple:r,alternate:n,alternateTriple:i,usedCaip:!1}:ot(i)>=ot(r)?{primary:n,primaryTriple:i,alternate:e,alternateTriple:r,usedCaip:!0}:{primary:e,primaryTriple:r,alternate:n,alternateTriple:i,usedCaip:!1}:{primary:n,primaryTriple:i,alternate:null,alternateTriple:null,usedCaip:!0}:{primary:e,primaryTriple:r,alternate:null,alternateTriple:null,usedCaip:!1}:{primary:null,primaryTriple:null,alternate:null,alternateTriple:null,usedCaip:!1})(a,g||null,f||null,I.plain||null,I.caip||null),$=ot(S.alternateTriple),k={hasAlternateTrustData:$>0n,alternateAtomId:null===(d=S.alternate)||void 0===d?void 0:d.term_id,alternateMarketCap:$.toString(),alternateIsCaip:!S.usedCaip};let j=null;if(S.primary){var u,_;const t=await h('\n query GetTriplesWithHighestStake($subjectId: String!, $predicateId: String!) {\n triples(\n where: {\n subject_id: { _eq: $subjectId },\n predicate_id: { _eq: $predicateId }\n },\n order_by: { triple_term: { total_market_cap: desc } }\n ) {\n term_id\n subject_id\n predicate_id\n object_id\n creator_id\n counter_term_id\n\n # Triple-specific aggregated market data (stake information)\n triple_term {\n term_id\n counter_term_id\n total_market_cap\n total_position_count\n }\n\n # Individual vault data\n term {\n vaults(where: { curve_id: { _eq: "1" } }) {\n term_id\n market_cap\n position_count\n curve_id\n }\n }\n\n counter_term {\n vaults(where: { curve_id: { _eq: "1" } }) {\n term_id\n market_cap\n position_count\n curve_id\n }\n }\n\n # Object information for context\n object {\n label\n image\n data\n }\n }\n\n chainlink_prices(limit: 1, order_by: { id: desc }) {\n usd\n }\n }\n',{subjectId:S.primary.term_id,predicateId:w});j=(null===(_=t.data.triples[0])||void 0===_||null===(u=_.object)||void 0===u?void 0:u.label)||null}return{account:S.primary,triple:S.primaryTriple,isContract:s,alias:j,classification:a,alternateTrustData:k}}catch(t){throw t}},st=async(t,e)=>{const n=(t=>{if(t)try{return new URL(t).hostname}catch{var e;return null===(e=t.match(/^(?:https?:\/\/)?([^\/]+)/))||void 0===e?void 0:e[1]}})(t);if(!t||!n)return{origin:null,triple:null,hostname:void 0};try{var r;const o=null===(r=(await h(_,{originUrl:t})).data.atoms)||void 0===r?void 0:r[0];if(!o){var i;const t=null===(i=(await h(_,{originUrl:n})).data.atoms)||void 0===i?void 0:i[0];return t?await lt(t,n,e):{origin:null,triple:null,hostname:n}}return await lt(o,n,e)}catch{return{origin:null,triple:null,hostname:n}}},lt=async(t,e,n)=>{const{hasTagAtomId:r,trustworthyAtomId:i}=p,o=n||"";try{var a;const n=await h('\nquery OriginTrustTriple($subjectId: String!, $predicateId: String!, $objectId: String!, $userAddress: String!) {\n triples(where: {\n subject_id: { _eq: $subjectId },\n predicate_id: { _eq: $predicateId },\n object_id: { _eq: $objectId }\n }) {\n term_id\n\n term {\n vaults(where: { curve_id: { _eq: "1" } }) {\n term_id\n market_cap\n position_count\n }\n }\n\n counter_term {\n vaults(where: { curve_id: { _eq: "1" } }) {\n term_id\n market_cap\n position_count\n }\n }\n\n positions(order_by: { shares: desc }, limit: 30) {\n id\n shares\n account_id\n }\n\n counter_positions(order_by: { shares: desc }, limit: 30) {\n id\n shares\n account_id\n }\n\n # User\'s specific position (if any)\n user_position: positions(where: { account_id: { _ilike: $userAddress } }) {\n account_id\n shares\n }\n\n # User\'s specific counter-position (if any)\n user_counter_position: counter_positions(where: { account_id: { _ilike: $userAddress } }) {\n account_id\n shares\n }\n }\n}\n',{subjectId:t.term_id,predicateId:r,objectId:i,userAddress:o});return{origin:t,triple:(null===(a=n.data.triples)||void 0===a?void 0:a[0])||null,hostname:e}}catch{return{origin:t,triple:null,hostname:e}}},ct=36e5;async function dt(t){try{const n=await snap.request({method:"snap_manageState",params:{operation:"get"}});if(!n)return null;const r=n[t.toLowerCase()];return r?(e=r.timestamp,Date.now()-e<ct?r.contacts:null):null}catch{return null}var e}function ut(t){return!!t&&/^0x[a-fA-F0-9]{40}$/i.test(t)}async function pt(t){const e=await dt(t);if(null!==e)return e;const n=await async function(t){var e,n;const{hasTagAtomId:r,trustworthyAtomId:i}=p,o=(null===(n=await h(g,{userAddress:t,predicateId:r,objectId:i}))||void 0===n||null===(e=n.data)||void 0===e?void 0:e.positions)||[],a=new Map;for(const t of o){var s;const e=null===(s=t.term)||void 0===s?void 0:s.triple;if(!e)continue;const{subject:n}=e;if(!n)continue;const r=ut(n.data)?n.data:ut(n.label)?n.label:null;if(!r)continue;const i=r.toLowerCase();a.has(i)||a.set(i,{accountId:r,label:n.label||r})}return Array.from(a.values())}(t);return await async function(t,e){try{const n=await snap.request({method:"snap_manageState",params:{operation:"get"}}),r=t.toLowerCase(),i={contacts:e,timestamp:Date.now()},o={...n||{},[r]:i};await snap.request({method:"snap_manageState",params:{operation:"update",newState:JSON.parse(JSON.stringify(o))}})}catch{}}(t,n),n}function ht(t,e,n){const r=new Set(t.map((t=>t.accountId.toLowerCase()))),i=new Map(t.map((t=>[t.accountId.toLowerCase(),t.label]))),o=[];for(const t of e){var a;const e=null===(a=t.account_id)||void 0===a?void 0:a.toLowerCase();var s;if(e&&r.has(e))o.push({accountId:t.account_id,label:i.get(e)||(null===(s=t.account)||void 0===s?void 0:s.label)||mt(t.account_id),shares:t.shares||"0"})}const l=[];for(const t of n){var c;const e=null===(c=t.account_id)||void 0===c?void 0:c.toLowerCase();var d;if(e&&r.has(e))l.push({accountId:t.account_id,label:i.get(e)||(null===(d=t.account)||void 0===d?void 0:d.label)||mt(t.account_id),shares:t.shares||"0"})}return o.sort(((t,e)=>{const n=BigInt(t.shares??"0"),r=BigInt(e.shares??"0");return r>n?1:r<n?-1:0})),l.sort(((t,e)=>{const n=BigInt(t.shares??"0"),r=BigInt(e.shares??"0");return r>n?1:r<n?-1:0})),{forContacts:o,againstContacts:l}}function mt(t){return!t||t.length<12?t||"Unknown":`${t.slice(0,6)}...${t.slice(-4)}`}async function _t(t){const e=[...t.forContacts,...t.againstContacts];if(0===e.length)return t;const n=[...new Set(e.map((t=>t.accountId)))],r=n.map((t=>t.toLowerCase())),i=[...n,...r];try{var o,a;const e=(null===(a=await h("\nquery AtomsForAddresses($addresses: [String!]!) {\n atoms(\n where: {\n _or: [\n { label: { _in: $addresses } },\n { data: { _in: $addresses } }\n ]\n }\n ) {\n term_id\n label\n data\n image\n }\n}\n",{addresses:i}))||void 0===a||null===(o=a.data)||void 0===o?void 0:o.atoms)||[],n=new Map;for(const t of e){var s,l;const e=null===(s=t.data)||void 0===s?void 0:s.toLowerCase(),r=null===(l=t.label)||void 0===l?void 0:l.toLowerCase(),i=t.label&&!/^0x[a-fA-F0-9]{40}$/iu.test(t.label);e&&i&&n.set(e,t.label),r&&i&&r!==e&&n.set(r,t.label)}const r=t=>{const e=t.accountId.toLowerCase(),r=n.get(e);return r?{...t,label:r}:/^0x[a-fA-F0-9]{40}$/iu.test(t.label)?{...t,label:mt(t.label)}:t};return{forContacts:t.forContacts.map(r),againstContacts:t.againstContacts.map(r)}}catch(e){console.error("[TrustedCircle] Label enrichment failed:",e);const n=t=>({...t,label:/^0x[a-fA-F0-9]{40}$/iu.test(t.label)?mt(t.label):t.label});return{forContacts:t.forContacts.map(n),againstContacts:t.againstContacts.map(n)}}}const gt=async({transaction:t,chainId:e,transactionOrigin:i})=>{var o;const s=t.from,[l,c,d]=await Promise.all([at(t,e,s),st(i,s),s?pt(s):Promise.resolve([])]),u=(t=>{const{account:e,triple:n}=t;return e?null===n?f.AtomWithoutTrustTriple:f.AtomWithTrustTriple:f.NoAtom})(l),p=((t,e)=>{if(!e)return b.NoOrigin;const{origin:n,triple:r}=t;return n?r?b.AtomWithTrustTriple:b.AtomWithoutTrustTriple:b.NoAtom})(c,i);let h,m;if(d.length>0&&l.triple){h=ht(d,l.triple.positions||[],l.triple.counter_positions||[]),h=0===h.forContacts.length&&0===h.againstContacts.length?void 0:await _t(h)}if(d.length>0&&c.triple){m=ht(d,c.triple.positions||[],c.triple.counter_positions||[]),m=0===m.forContacts.length&&0===m.againstContacts.length?void 0:await _t(m)}const _={...l,accountType:u,address:t.to,userAddress:s,chainId:e,transactionOrigin:i,trustedCircle:h},g={...c,originType:p,originUrl:i,trustedCircle:m},v=(t=>{const{accountType:e}=t;return H[e](t)})(_);let w=null;"metamask"!==(null===(o=g)||void 0===o?void 0:o.originUrl)&&(w=(t=>{const{originType:e}=t;return et[e](t)})(g));const y=n(it,{accountProps:_,originProps:g}),T=r(a,{children:[v,w,y]}),A=(t=>JSON.parse(JSON.stringify(t)))({account:_,origin:g});return{id:await snap.request({method:"snap_createInterface",params:{ui:T,context:A}})}},ft=async t=>{},bt=async()=>({content:r(a,{children:[n(s,{children:"Welcome to Hive Mind, powered by Intuition"}),n(l,{children:"Real-time trust and sentiment insights for every transaction."}),n(c,{}),n(l,{children:"Hive Mind shows you community trust data from the Intuition knowledge graph during transactions."}),r(a,{children:[n(d,{href:"https://hivemindhq.io",children:"Check out Hive Mind's product suite"}),n(d,{href:"https://intuition.systems",children:"Learn about Intuition"})]})]})});var vt=exports;for(var wt in e)vt[wt]=e[wt];e.__esModule&&Object.defineProperty(vt,"__esModule",{value:!0})})();
|
|
1
|
+
(()=>{"use strict";var t={d:(e,n)=>{for(var r in n)t.o(n,r)&&!t.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:n[r]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},e={};function n(t,e,n){if("string"==typeof t)throw new Error(`An HTML element ("${String(t)}") was used in a Snap component, which is not supported by Snaps UI. Please use one of the supported Snap components.`);if(!t)throw new Error("A JSX fragment was used in a Snap component, which is not supported by Snaps UI. Please use one of the supported Snap components.");return t({...e,key:n})}function r(t,e,r){return n(t,e,r)}function i(t){return Object.fromEntries(Object.entries(t).filter((([,t])=>void 0!==t)))}function o(t){return e=>{const{key:n=null,...r}=e;return{type:t,props:i(r),key:n}}}t.r(e),t.d(e,{onHomePage:()=>Lt,onTransaction:()=>lt,onUserInput:()=>Pt});const a=o("Box"),s=o("Heading"),l=o("Text"),c=o("Divider"),d=o("Link"),u={backendUrl:"https://mainnet.intuition.sh/v1/graphql",rpcUrl:"https://rpc.intuition.systems",chainId:1155,chainIdHex:"0x483",chainName:"Intuition Mainnet",chainKey:"intuition-mainnet",currencySymbol:"TRUST",decimalPrecision:18,hasTagAtomId:"0x6de69cc0ae3efe4000279b1bf365065096c8715d8180bc2a98046ee07d3356fd",trustworthyAtomId:"0xe9c0e287737685382bd34d51090148935bdb671c98d20180b2fec15bd263f73a",hasAliasAtomId:"0xf8cfb4e3f1db08f72f255cf7afaceb4b32684a64dac0f423cdca04dd15cf4fd6",hivemindApiUrl:"https://api.hivemindhq.io"},p=u,h=async(t,e)=>{const n=await fetch(p.backendUrl,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({query:t,variables:e})});if(!n.ok)throw new Error(`GraphQL request failed: ${n.status} ${n.statusText}`);const r=await n.json();if(r.errors&&r.errors.length>0)throw new Error(`GraphQL error: ${r.errors[0].message}`);return r},m='\nquery TripleWithPositionAggregates($subjectId: String!, $predicateId: String!, $objectId: String!, $userAddress: String!) {\n triples(where: {\n subject_id: { _eq: $subjectId },\n predicate_id: { _eq: $predicateId },\n object_id: { _eq: $objectId }\n }) {\n term_id\n subject_id\n predicate_id\n object_id\n creator_id\n counter_term_id\n\n # Main vault (support) market data\n term {\n vaults(where: { curve_id: { _eq: "1" } }) {\n term_id\n market_cap\n position_count\n curve_id\n }\n }\n\n # Counter vault (oppose) market data\n counter_term {\n vaults(where: { curve_id: { _eq: "1" } }) {\n term_id\n market_cap\n position_count\n curve_id\n }\n }\n\n # Triple-specific aggregated market data\n triple_term {\n term_id\n counter_term_id\n total_market_cap\n total_position_count\n }\n\n # Detailed triple vault data per curve\n triple_vault {\n term_id\n counter_term_id\n curve_id\n position_count\n market_cap\n }\n\n positions_aggregate {\n aggregate {\n count\n sum {\n shares\n }\n avg {\n shares\n }\n }\n }\n\n counter_positions_aggregate {\n aggregate {\n count\n sum {\n shares\n }\n avg {\n shares\n }\n }\n }\n\n positions(\n order_by: { shares: desc }\n limit: 30\n ) {\n id\n account_id\n term_id\n curve_id\n shares\n account {\n id\n label\n }\n }\n\n counter_positions(\n order_by: { shares: desc }\n limit: 30\n ) {\n id\n account_id\n term_id\n curve_id\n shares\n account {\n id\n label\n }\n }\n\n # User\'s specific position (if any)\n user_position: positions(where: { account_id: { _ilike: $userAddress } }) {\n account_id\n shares\n }\n\n # User\'s specific counter-position (if any)\n user_counter_position: counter_positions(where: { account_id: { _ilike: $userAddress } }) {\n account_id\n shares\n }\n }\n chainlink_prices(limit: 1, order_by: { id: desc }) {\n usd\n }\n backup_chainlink_prices: chainlink_prices(\n limit: 1,\n order_by: { id: desc },\n where: { usd: { _is_null: false } }\n ) {\n usd\n }\n}\n',f="\nquery OriginAtom($originUrl: String!) {\n atoms(\n where: {\n _or: [\n { label: { _ilike: $originUrl } },\n { data: { _ilike: $originUrl } }\n ]\n },\n order_by: { term: { total_market_cap: desc_nulls_last } },\n limit: 1\n ) {\n term_id\n type\n label\n image\n data\n emoji\n creator_id\n }\n}\n",v="\nquery UserTrustedCircle($userAddress: String!, $predicateId: String!, $objectId: String!) {\n positions(\n where: {\n account_id: { _ilike: $userAddress },\n term: {\n triple: {\n predicate_id: { _eq: $predicateId },\n object_id: { _eq: $objectId }\n }\n }\n },\n order_by: { shares: desc },\n limit: 200\n ) {\n term {\n triple {\n subject_id\n subject {\n label\n data\n }\n }\n }\n }\n}\n";var g,_;!function(t){t.NoAtom="NoAtom",t.AtomWithoutTrustTriple="AtomWithoutTrustTriple",t.AtomWithTrustTriple="AtomWithTrustTriple"}(g||(g={})),function(t){t.NoOrigin="NoOrigin",t.NoAtom="OriginNoAtom",t.AtomWithoutTrustTriple="OriginAtomWithoutTrustTriple",t.AtomWithTrustTriple="OriginAtomWithTrustTriple"}(_||(_={}));const y=(t,e)=>{const n=BigInt(t),r=BigInt(10**e),i=n/r,o=(n%r).toString().padStart(e,"0").slice(0,6);return Number(`${i}.${o}`)},b=o("Section"),w=o("Row"),T=o("Address"),A=o("Bold");function $(t){if(0===t.length)return"";const e=t.slice(0,3).map((t=>function(t){if(/^0x[a-fA-F0-9]{40}$/u.test(t))return`${t.slice(0,6)}...${t.slice(-4)}`;if(t.startsWith("caip10:")){const e=t.split(":"),n=e[e.length-1];if(n&&/^0x[a-fA-F0-9]{40}$/u.test(n))return`${n.slice(0,6)}...${n.slice(-4)}`}return t}(t.label)));if(t.length>3){const n=t.length-3;return`${e.join(", ")} +${n} more`}return e.join(", ")}const I=({forContacts:t,againstContacts:e})=>0===t.length&&0===e.length?null:r(b,{children:[n(s,{size:"sm",children:"Your Trust Circle"}),t.length>0&&n(w,{label:"FOR",children:n(l,{color:"success",children:n(A,{children:$(t)})})}),e.length>0&&n(w,{label:"AGAINST",children:n(l,{color:"warning",children:n(A,{children:$(e)})})})]});function S(t){const e=BigInt(t),n=p.decimalPrecision,r=BigInt(10**n),i=e%r*100n/r,o=Number(e/r).toLocaleString();return`${i>0?`${o}.${i.toString().padStart(2,"0")}`:o} ${p.currencySymbol}`}const k=({userPosition:t,userCounterPosition:e})=>{var i,o;const a=null===(i=t)||void 0===i?void 0:i[0],c=null===(o=e)||void 0===o?void 0:o[0];return a||c?r(b,{children:[n(s,{size:"sm",children:"Your Position"}),a?n(w,{label:"You TRUST",children:n(l,{color:"success",children:n(A,{children:S(a.shares)})})}):null,c?n(w,{label:"You DISTRUST",children:n(l,{color:"warning",children:n(A,{children:S(c.shares)})})}):null]}):null},C=t=>{const e=Math.floor(t),n=Math.round(100*(t-e)),r=e.toLocaleString();return`${n>0?`${r}.${n.toString().padStart(2,"0")}`:r} ${p.currencySymbol}`},j=()=>n(s,{size:"sm",children:"Destination"}),U=({alternateTrustData:t,isContract:e})=>{if(!t.hasAlternateTrustData)return null;const r=t.alternateIsCaip?`Also has data as a contract on ${p.chainName}`:"Also has data as an EOA";return n(l,{color:"default",children:r})},x={[g.NoAtom]:t=>{const{address:e,isContract:i,alternateTrustData:o}=t,a=i?"contract":"address";return r(b,{children:[n(j,{}),n(w,{label:"Address",children:n(T,{address:e})}),n(w,{label:"Status",variant:"warning",children:n(l,{color:"warning",children:r(A,{children:["Unknown ",a]})})}),n(l,{color:"default",children:"No community data on Intuition"}),n(U,{alternateTrustData:o,isContract:i})]})},[g.AtomWithoutTrustTriple]:t=>{const{address:e,account:i,alias:o,isContract:a,alternateTrustData:s}=t;return r(b,{children:[n(j,{}),n(w,{label:"Address",children:n(T,{address:e})}),!!o&&n(w,{label:"Alias",children:n(l,{children:n(A,{children:o})})}),n(w,{label:"Status",children:n(l,{color:"default",children:"No trust rating yet"})}),n(l,{color:"default",children:"Known address, awaiting community votes"}),n(U,{alternateTrustData:s,isContract:a})]})},[g.AtomWithTrustTriple]:t=>{var e,i,o,s;const{address:c,triple:d,alias:u,isContract:p,alternateTrustData:h,trustedCircle:m}=t,{counter_term:{vaults:[f]},term:{vaults:[v]},positions:g,counter_positions:_,user_position:$,user_counter_position:S}=d,x=(null===(e=v)||void 0===e?void 0:e.market_cap)||"0",O=y(x,18),N=(null===(i=f)||void 0===i?void 0:i.market_cap)||"0",q=O+y(N,18),P=q>0?O/q*100:0,L=g.length,E=_.length,W=L+E,F=(t=>t.map((t=>parseFloat(t.shares)||0)).filter((t=>t>0)))(g),D=(t=>{if(0===t.length)return 0;const e=t.reduce(((t,e)=>t+e),0);return 0===e?0:Math.max(...t)/e*100})(F),M=q>0?(t=>t>=90?"🟢":t>=70?"🟡":"🔴")(P):"",R=F.length>0?(t=>t>=25?"🟡":"")(D):"",B=q>0?((t,e,n)=>{const r=t<90,i=e<3,o=n>=25;return r||i||o?r&&i&&o?"Disputed, limited, and concentrated":r&&i?"Disputed with limited data":r&&o?"Disputed and dominated by one staker":i&&o?"Limited data, dominated by one staker":r?"Trustworthiness is actively disputed":i?"Limited trust data available":o?"Trust signal dominated by one staker":null:null})(P,W,D):null,H=((null===(o=$)||void 0===o?void 0:o.length)??0)>0||((null===(s=S)||void 0===s?void 0:s.length)??0)>0;return r(b,{children:[n(j,{}),n(w,{label:"Address",children:n(T,{address:c})}),!!u&&n(w,{label:"Alias",children:n(l,{children:n(A,{children:u})})}),H&&n(k,{userPosition:$??[],userCounterPosition:S??[]}),m?n(I,{forContacts:m.forContacts,againstContacts:m.againstContacts}):null,q>0?r(a,{children:[n(w,{label:"Trustworthy",children:n(l,{children:n(A,{children:`${M} ${P.toFixed(0)}%`})})}),F.length>0&&n(w,{label:"Top staker",children:n(l,{children:n(A,{children:R?`${R} ${D.toFixed(0)}%`:`${D.toFixed(0)}%`})})}),n(w,{label:"Total staked",children:n(l,{children:n(A,{children:C(q)})})}),n(w,{label:"Stakers",children:n(l,{children:n(A,{children:`${L} FOR · ${E} AGAINST`})})}),B?n(l,{color:"alternative",children:B}):null]}):n(w,{label:"Trustworthy",children:n(l,{color:"muted",children:n(A,{children:"No stakes yet"})})}),n(U,{alternateTrustData:h,isContract:p})]})}},O=o("Button"),N=({label:t})=>n(a,{children:r(b,{children:[n(s,{children:"AI Summary"}),r(l,{children:["Generating summary for ",n(A,{children:t}),"..."]}),n(l,{children:"Hang tight — this can take up to 30 seconds."})]})}),q=({summary:t,label:e})=>r(a,{children:[r(b,{children:[n(s,{children:"AI Summary"}),n(l,{children:n(A,{children:e})})]}),n(c,{}),n(b,{children:n(l,{children:t})}),n(c,{}),n(a,{children:n(O,{name:"back",children:"Back to Transaction Insight"})})]}),P=({error:t})=>r(a,{children:[r(b,{children:[n(s,{children:"AI Summary"}),r(l,{children:["Unable to generate summary: ",t]})]}),n(c,{}),n(a,{children:n(O,{name:"back",children:"Back to Transaction Insight"})})]}),L={1155:"https://preview.explorer.hivemindhq.io",13579:"https://testnet.explorer.hivemindhq.io"}[p.chainId]??"https://preview.explorer.hivemindhq.io",E={name:"Hive Mind Explorer",noAtom:t=>{const{address:e}=t,n=new URL(`/address/${e}`,L);return n.searchParams.set("action","trust"),{url:n.toString()}},atomWithoutTrustTriple:t=>{const{address:e}=t,n=new URL(`/address/${e}`,L);return n.searchParams.set("action","trust"),{url:n.toString()}},atomWithTrustTriple:t=>{const{address:e}=t,n=new URL(`/address/${e}`,L);return n.searchParams.set("action","trust"),{url:n.toString()}},viewAtom:t=>{const{address:e}=t;return{url:new URL(`/address/${e}`,L).toString()}},createAlias:t=>{const{address:e}=t,n=new URL(`/address/${e}`,L);return n.searchParams.set("action","alias"),{url:n.toString()}},originNoAtom:t=>{const{hostname:e}=t;if(!e)return{url:L};const n=new URL(`/domain/${encodeURIComponent(e)}`,L);return n.searchParams.set("action","trust"),{url:n.toString()}},originAtomWithoutTrustTriple:t=>{var e,n;const{hostname:r,origin:i}=t,o=r||(null===(e=i)||void 0===e?void 0:e.data)||(null===(n=i)||void 0===n?void 0:n.label);if(!o)throw new Error("originAtomWithoutTrustTriple: no hostname or origin data");const a=new URL(`/domain/${encodeURIComponent(o)}`,L);return a.searchParams.set("action","trust"),{url:a.toString()}},originAtomWithTrustTriple:t=>{var e,n;const{hostname:r,origin:i}=t,o=r||(null===(e=i)||void 0===e?void 0:e.data)||(null===(n=i)||void 0===n?void 0:n.label);if(!o)throw new Error("originAtomWithTrustTriple: no hostname or origin data");const a=new URL(`/domain/${encodeURIComponent(o)}`,L);return a.searchParams.set("action","trust"),{url:a.toString()}},viewOriginAtom:t=>{var e,n;const{hostname:r,origin:i}=t,o=r||(null===(e=i)||void 0===e?void 0:e.data)||(null===(n=i)||void 0===n?void 0:n.label);if(!o)throw new Error("viewOriginAtom: no hostname or origin data");return{url:new URL(`/domain/${encodeURIComponent(o)}`,L).toString()}}},W=E,F=({href:t,label:e})=>n(a,{children:n(d,{href:t,children:e})}),D=t=>{if(t.accountType!==g.NoAtom)return null;const{url:e}=W.noAtom(t);return n(F,{href:e,label:"Create trust claim"})},M=t=>{if(t.accountType===g.NoAtom)return null;if(t.accountType===g.AtomWithoutTrustTriple){const{url:e}=W.atomWithoutTrustTriple(t);return n(F,{href:e,label:"Is this address trustworthy? Vote"})}if(t.accountType===g.AtomWithTrustTriple){const{triple:e,userAddress:r}=t;if(!!r&&(e.positions.some((t=>{var e;return(null===(e=t.account_id)||void 0===e?void 0:e.toLowerCase())===r.toLowerCase()}))||e.counter_positions.some((t=>{var e;return(null===(e=t.account_id)||void 0===e?void 0:e.toLowerCase())===r.toLowerCase()}))))return null;const{url:i}=W.atomWithTrustTriple(t);return n(F,{href:i,label:"Is this address trustworthy? Vote"})}return null},R=t=>{if(t.accountType===g.NoAtom)return null;if(t.alias)return null;const{url:e}=W.createAlias(t);return n(F,{href:e,label:"Add alias"})},B=t=>{if(t.accountType===g.NoAtom)return null;const{url:e}=W.viewAtom(t);return n(F,{href:e,label:"View more about this address"})},H=t=>{const e=Math.floor(t),n=Math.round(100*(t-e)),r=e.toLocaleString();return`${n>0?`${r}.${n.toString().padStart(2,"0")}`:r} ${p.currencySymbol}`},J=()=>n(s,{size:"sm",children:"dApp Origin"}),G={[_.NoOrigin]:t=>null,[_.NoAtom]:t=>{const{hostname:e,originUrl:i}=t,o=e||i?W.originNoAtom(t).url:null;return r(b,{children:[n(J,{}),n(w,{label:"From",children:n(l,{children:n(A,{children:e||"Unknown"})})}),n(w,{label:"Status",variant:"warning",children:n(l,{color:"warning",children:n(A,{children:"Unknown dApp"})})}),n(l,{color:"default",children:"No community data. Proceed with caution."}),o?n(l,{children:n(d,{href:o,children:"Be first to add trust data for this dApp ↗"})}):null]})},[_.AtomWithoutTrustTriple]:t=>{var e;const{hostname:i,origin:o}=t,a=W.originAtomWithoutTrustTriple(t).url;return r(b,{children:[n(J,{}),n(w,{label:"From",children:n(l,{children:n(A,{children:i||(null===(e=o)||void 0===e?void 0:e.label)||"Unknown"})})}),n(w,{label:"Status",children:n(l,{color:"default",children:"No trust rating yet"})}),n(l,{color:"default",children:"Known dApp, awaiting community votes."}),n(l,{children:n(d,{href:a,children:"Be first to vote on this dApp ↗"})})]})},[_.AtomWithTrustTriple]:t=>{var e,i,o,s,c,u,p,h,m,f,v;const{hostname:g,origin:_,triple:T,trustedCircle:$}=t,S=null===(i=T.term)||void 0===i||null===(e=i.vaults)||void 0===e?void 0:e[0],C=null===(s=T.counter_term)||void 0===s||null===(o=s.vaults)||void 0===o?void 0:o[0],j=(null===(c=S)||void 0===c?void 0:c.market_cap)||"0",U=y(j,18),x=(null===(u=C)||void 0===u?void 0:u.market_cap)||"0",O=y(x,18),N=(null===(p=T.positions)||void 0===p?void 0:p.length)||0,q=(null===(h=T.counter_positions)||void 0===h?void 0:h.length)||0,P=N+q,L=U+O,E=L>0?U/L*100:0,F=(T.positions||[]).map((t=>parseFloat(t.shares)||0)).filter((t=>t>0));const D=(t=>{if(0===t.length)return 0;const e=t.reduce(((t,e)=>t+e),0);return 0===e?0:Math.max(...t)/e*100})(F),M=L>0?(t=>t>=90?"🟢":t>=70?"🟡":"🔴")(E):"",R=F.length>0?(t=>t>=25?"🟡":"")(D):"",B=L>0?((t,e,n)=>{const r=t<90,i=e<3,o=n>=25;return r||i||o?r&&i&&o?"Disputed, limited, and concentrated":r&&i?"Disputed with limited data":r&&o?"Disputed and dominated by one staker":i&&o?"Limited data, dominated by one staker":r?"Trustworthiness is actively disputed":i?"Limited trust data available":o?"Trust signal dominated by one staker":null:null})(E,P,D):null,{user_position:G,user_counter_position:z}=T,V=((null===(m=G)||void 0===m?void 0:m.length)??0)>0||((null===(f=z)||void 0===f?void 0:f.length)??0)>0;return r(b,{children:[n(J,{}),n(w,{label:"From",children:n(l,{children:n(A,{children:g||(null===(v=_)||void 0===v?void 0:v.label)||"Unknown"})})}),V&&n(k,{userPosition:G??[],userCounterPosition:z??[]}),$?n(I,{forContacts:$.forContacts,againstContacts:$.againstContacts}):null,L>0?r(a,{children:[n(w,{label:"Trustworthy",children:n(l,{children:n(A,{children:`${M} ${E.toFixed(0)}%`})})}),F.length>0&&n(w,{label:"Top staker",children:n(l,{children:n(A,{children:R?`${R} ${D.toFixed(0)}%`:`${D.toFixed(0)}%`})})}),n(w,{label:"Total staked",children:n(l,{children:n(A,{children:H(L)})})}),n(w,{label:"Stakers",children:n(l,{children:n(A,{children:`${N} FOR · ${q} AGAINST`})})}),B?n(l,{color:"alternative",children:B}):null]}):n(w,{label:"Trustworthy",children:n(l,{color:"muted",children:n(A,{children:"No stakes yet"})})}),n(l,{children:n(d,{href:W.originAtomWithTrustTriple(t).url,children:"Vote on this dApp ↗"})})]})}},z=t=>{if(t.originType===_.NoOrigin||t.originType===_.NoAtom||"metamask"===t.originUrl)return null;const{url:e}=W.viewOriginAtom(t);return n(F,{href:e,label:"View more about this dApp"})},V=({accountProps:t,originProps:e})=>{const i="metamask"!==e.originUrl&&(e.originType===_.AtomWithoutTrustTriple||e.originType===_.AtomWithTrustTriple),o=t.accountType===g.AtomWithTrustTriple&&((null===(u=t.triple)||void 0===u||null===(d=u.term)||void 0===d||null===(l=d.vaults)||void 0===l||null===(s=l[0])||void 0===s?void 0:s.position_count)??0)+((null===(f=t.triple)||void 0===f||null===(m=f.counter_term)||void 0===m||null===(h=m.vaults)||void 0===h||null===(p=h[0])||void 0===p?void 0:p.position_count)??0)>=3;var s,l,d,u,p,h,m,f;return r(a,{children:[n(c,{}),r(a,{children:[n(D,{...t}),n(M,{...t}),n(R,{...t}),n(B,{...t}),i&&n(z,{...e}),o&&n(O,{name:"ai_summary",children:"AI Summary"})]})]})},Y=t=>{var e,n,r,i,o,a;if(!t)return 0n;return BigInt((null===(r=t.term)||void 0===r||null===(n=r.vaults)||void 0===n||null===(e=n[0])||void 0===e?void 0:e.market_cap)??"0")+BigInt((null===(a=t.counter_term)||void 0===a||null===(o=a.vaults)||void 0===o||null===(i=o[0])||void 0===i?void 0:i.market_cap)??"0")},K=async(t,e,n)=>{const{to:r,data:i}=t,o=((t,e)=>`caip10:${e}:${t}`)(r,e),a=await(async(t,e)=>{if("0x"!==e)return{type:"contract",certainty:"definite"};try{const e=await fetch(p.rpcUrl,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",method:"eth_getCode",params:[t,"latest"],id:1})});if(!e.ok)return{type:"unknown",certainty:"uncertain",reason:"eth_getCode_failed"};const n=(await e.json()).result;return"0x"===n||null===n?{type:"eoa",certainty:"definite"}:{type:"contract",certainty:"definite"}}catch(t){return{type:"unknown",certainty:"uncertain",reason:"eth_getCode_failed"}}})(r,i),s="contract"===a.type||"uncertain"===a.certainty;try{var l,c,d;const[t]=await Promise.all([h("\nquery AddressAtoms($plainAddress: String!, $caipAddress: String!) {\n # Atoms matching plain address format (for EOAs)\n plainAtoms: atoms(\n where: {\n _or: [\n { label: { _ilike: $plainAddress } },\n { data: { _ilike: $plainAddress } }\n ]\n },\n order_by: { term: { total_market_cap: desc_nulls_last } },\n limit: 1\n ) {\n term_id\n type\n label\n image\n data\n emoji\n creator_id\n }\n\n # Atoms matching CAIP format (for smart contracts)\n caipAtoms: atoms(\n where: {\n _or: [\n { label: { _ilike: $caipAddress } },\n { data: { _ilike: $caipAddress } }\n ]\n },\n order_by: { term: { total_market_cap: desc_nulls_last } },\n limit: 1\n ) {\n term_id\n type\n label\n image\n data\n emoji\n creator_id\n }\n}\n",{plainAddress:r,caipAddress:o})]),{plainAtoms:e,caipAtoms:i}=t.data,v=null===(l=e)||void 0===l?void 0:l[0],g=null===(c=i)||void 0===c?void 0:c[0];if(!v&&!g)return{account:null,triple:null,isContract:s,alias:null,classification:a,alternateTrustData:{hasAlternateTrustData:!1}};const{hasTagAtomId:_,trustworthyAtomId:y,hasAliasAtomId:b}=p,w=[],T=[],A=n||"";v&&(w.push(h(m,{subjectId:v.term_id,predicateId:_,objectId:y,userAddress:A})),T.push("plain")),g&&(w.push(h(m,{subjectId:g.term_id,predicateId:_,objectId:y,userAddress:A})),T.push("caip"));const $=await Promise.all(w),I={};T.forEach(((t,e)=>{I[t]=$[e].data.triples[0]||null}));const S=((t,e,n,r,i)=>n||e?n?e?"definite"===t.certainty?"contract"===t.type?{primary:n,primaryTriple:i,alternate:e,alternateTriple:r,usedCaip:!0}:{primary:e,primaryTriple:r,alternate:n,alternateTriple:i,usedCaip:!1}:Y(i)>=Y(r)?{primary:n,primaryTriple:i,alternate:e,alternateTriple:r,usedCaip:!0}:{primary:e,primaryTriple:r,alternate:n,alternateTriple:i,usedCaip:!1}:{primary:n,primaryTriple:i,alternate:null,alternateTriple:null,usedCaip:!0}:{primary:e,primaryTriple:r,alternate:null,alternateTriple:null,usedCaip:!1}:{primary:null,primaryTriple:null,alternate:null,alternateTriple:null,usedCaip:!1})(a,v||null,g||null,I.plain||null,I.caip||null),k=Y(S.alternateTriple),C={hasAlternateTrustData:k>0n,alternateAtomId:null===(d=S.alternate)||void 0===d?void 0:d.term_id,alternateMarketCap:k.toString(),alternateIsCaip:!S.usedCaip};let j=null;if(S.primary){var u,f;const t=await h('\n query GetTriplesWithHighestStake($subjectId: String!, $predicateId: String!) {\n triples(\n where: {\n subject_id: { _eq: $subjectId },\n predicate_id: { _eq: $predicateId }\n },\n order_by: { triple_term: { total_market_cap: desc } }\n ) {\n term_id\n subject_id\n predicate_id\n object_id\n creator_id\n counter_term_id\n\n # Triple-specific aggregated market data (stake information)\n triple_term {\n term_id\n counter_term_id\n total_market_cap\n total_position_count\n }\n\n # Individual vault data\n term {\n vaults(where: { curve_id: { _eq: "1" } }) {\n term_id\n market_cap\n position_count\n curve_id\n }\n }\n\n counter_term {\n vaults(where: { curve_id: { _eq: "1" } }) {\n term_id\n market_cap\n position_count\n curve_id\n }\n }\n\n # Object information for context\n object {\n label\n image\n data\n }\n }\n\n chainlink_prices(limit: 1, order_by: { id: desc }) {\n usd\n }\n }\n',{subjectId:S.primary.term_id,predicateId:b});j=(null===(f=t.data.triples[0])||void 0===f||null===(u=f.object)||void 0===u?void 0:u.label)||null}return{account:S.primary,triple:S.primaryTriple,isContract:s,alias:j,classification:a,alternateTrustData:C}}catch(t){throw t}},Q=t=>{const{accountType:e}=t;return x[e](t)},X=async(t,e)=>{const n=(t=>{if(t)try{return new URL(t).hostname}catch{var e;return null===(e=t.match(/^(?:https?:\/\/)?([^\/]+)/))||void 0===e?void 0:e[1]}})(t);if(!t||!n)return{origin:null,triple:null,hostname:void 0};try{var r;const o=null===(r=(await h(f,{originUrl:t})).data.atoms)||void 0===r?void 0:r[0];if(!o){var i;const t=null===(i=(await h(f,{originUrl:n})).data.atoms)||void 0===i?void 0:i[0];return t?await Z(t,n,e):{origin:null,triple:null,hostname:n}}return await Z(o,n,e)}catch{return{origin:null,triple:null,hostname:n}}},Z=async(t,e,n)=>{const{hasTagAtomId:r,trustworthyAtomId:i}=p,o=n||"";try{var a;const n=await h('\nquery OriginTrustTriple($subjectId: String!, $predicateId: String!, $objectId: String!, $userAddress: String!) {\n triples(where: {\n subject_id: { _eq: $subjectId },\n predicate_id: { _eq: $predicateId },\n object_id: { _eq: $objectId }\n }) {\n term_id\n\n term {\n vaults(where: { curve_id: { _eq: "1" } }) {\n term_id\n market_cap\n position_count\n }\n }\n\n counter_term {\n vaults(where: { curve_id: { _eq: "1" } }) {\n term_id\n market_cap\n position_count\n }\n }\n\n positions(order_by: { shares: desc }, limit: 30) {\n id\n shares\n account_id\n }\n\n counter_positions(order_by: { shares: desc }, limit: 30) {\n id\n shares\n account_id\n }\n\n # User\'s specific position (if any)\n user_position: positions(where: { account_id: { _ilike: $userAddress } }) {\n account_id\n shares\n }\n\n # User\'s specific counter-position (if any)\n user_counter_position: counter_positions(where: { account_id: { _ilike: $userAddress } }) {\n account_id\n shares\n }\n }\n}\n',{subjectId:t.term_id,predicateId:r,objectId:i,userAddress:o});return{origin:t,triple:(null===(a=n.data.triples)||void 0===a?void 0:a[0])||null,hostname:e}}catch{return{origin:t,triple:null,hostname:e}}},tt=t=>{const{originType:e}=t;return G[e](t)},et=36e5;async function nt(t){try{const n=await snap.request({method:"snap_manageState",params:{operation:"get"}});if(!n)return null;const r=n[t.toLowerCase()];return r?(e=r.timestamp,Date.now()-e<et?r.contacts:null):null}catch{return null}var e}function rt(t){return!!t&&/^0x[a-fA-F0-9]{40}$/i.test(t)}async function it(t){const e=await nt(t);if(null!==e)return e;const n=await async function(t){var e,n;const{hasTagAtomId:r,trustworthyAtomId:i}=p,o=(null===(n=await h(v,{userAddress:t,predicateId:r,objectId:i}))||void 0===n||null===(e=n.data)||void 0===e?void 0:e.positions)||[],a=new Map;for(const t of o){var s;const e=null===(s=t.term)||void 0===s?void 0:s.triple;if(!e)continue;const{subject:n}=e;if(!n)continue;const r=rt(n.data)?n.data:rt(n.label)?n.label:null;if(!r)continue;const i=r.toLowerCase();a.has(i)||a.set(i,{accountId:r,label:n.label||r})}return Array.from(a.values())}(t);return await async function(t,e){try{const n=await snap.request({method:"snap_manageState",params:{operation:"get"}}),r=t.toLowerCase(),i={contacts:e,timestamp:Date.now()},o={...n||{},[r]:i};await snap.request({method:"snap_manageState",params:{operation:"update",newState:JSON.parse(JSON.stringify(o))}})}catch{}}(t,n),n}function ot(t,e,n,r){var i;const o=null===(i=r)||void 0===i?void 0:i.toLowerCase(),a=new Set(t.map((t=>t.accountId.toLowerCase()))),s=new Map(t.map((t=>[t.accountId.toLowerCase(),t.label]))),l=[];for(const t of e){var c;const e=null===(c=t.account_id)||void 0===c?void 0:c.toLowerCase();if(e===o)continue;var d;if(e&&a.has(e))l.push({accountId:t.account_id,label:s.get(e)||(null===(d=t.account)||void 0===d?void 0:d.label)||at(t.account_id),shares:t.shares||"0"})}const u=[];for(const t of n){var p;const e=null===(p=t.account_id)||void 0===p?void 0:p.toLowerCase();if(e===o)continue;var h;if(e&&a.has(e))u.push({accountId:t.account_id,label:s.get(e)||(null===(h=t.account)||void 0===h?void 0:h.label)||at(t.account_id),shares:t.shares||"0"})}return l.sort(((t,e)=>{const n=BigInt(t.shares??"0"),r=BigInt(e.shares??"0");return r>n?1:r<n?-1:0})),u.sort(((t,e)=>{const n=BigInt(t.shares??"0"),r=BigInt(e.shares??"0");return r>n?1:r<n?-1:0})),{forContacts:l,againstContacts:u}}function at(t){return!t||t.length<12?t||"Unknown":`${t.slice(0,6)}...${t.slice(-4)}`}async function st(t){const e=[...t.forContacts,...t.againstContacts];if(0===e.length)return t;const n=[...new Set(e.map((t=>t.accountId)))],r=n.map((t=>t.toLowerCase())),i=[...n,...r];try{var o,a;const e=(null===(a=await h("\nquery AtomsForAddresses($addresses: [String!]!) {\n atoms(\n where: {\n _or: [\n { label: { _in: $addresses } },\n { data: { _in: $addresses } }\n ]\n }\n ) {\n term_id\n label\n data\n image\n }\n}\n",{addresses:i}))||void 0===a||null===(o=a.data)||void 0===o?void 0:o.atoms)||[],n=new Map;for(const t of e){var s,l;const e=null===(s=t.data)||void 0===s?void 0:s.toLowerCase(),r=null===(l=t.label)||void 0===l?void 0:l.toLowerCase(),i=t.label&&!/^0x[a-fA-F0-9]{40}$/iu.test(t.label);e&&i&&n.set(e,t.label),r&&i&&r!==e&&n.set(r,t.label)}const r=t=>{const e=t.accountId.toLowerCase(),r=n.get(e);return r?{...t,label:r}:/^0x[a-fA-F0-9]{40}$/iu.test(t.label)?{...t,label:at(t.label)}:t};return{forContacts:t.forContacts.map(r),againstContacts:t.againstContacts.map(r)}}catch(e){console.error("[TrustedCircle] Label enrichment failed:",e);const n=t=>({...t,label:/^0x[a-fA-F0-9]{40}$/iu.test(t.label)?at(t.label):t.label});return{forContacts:t.forContacts.map(n),againstContacts:t.againstContacts.map(n)}}}const lt=async({transaction:t,chainId:e,transactionOrigin:i})=>{var o;console.log("transactionOrigin",i);const s=t.from,[l,c,d]=await Promise.all([K(t,e,s),X(i,s),s?it(s):Promise.resolve([])]),u=(t=>{const{account:e,triple:n}=t;return e?null===n?g.AtomWithoutTrustTriple:g.AtomWithTrustTriple:g.NoAtom})(l),p=((t,e)=>{if(!e)return _.NoOrigin;const{origin:n,triple:r}=t;return n?r?_.AtomWithTrustTriple:_.AtomWithoutTrustTriple:_.NoAtom})(c,i);let h,m;if(d.length>0&&l.triple){h=ot(d,l.triple.positions||[],l.triple.counter_positions||[],s),h=0===h.forContacts.length&&0===h.againstContacts.length?void 0:await st(h)}if(d.length>0&&c.triple){m=ot(d,c.triple.positions||[],c.triple.counter_positions||[],s),m=0===m.forContacts.length&&0===m.againstContacts.length?void 0:await st(m)}const f={...l,accountType:u,address:t.to,userAddress:s,chainId:e,transactionOrigin:i,trustedCircle:h},v={...c,originType:p,originUrl:i,trustedCircle:m},y=Q(f);let b=null;"metamask"!==(null===(o=v)||void 0===o?void 0:o.originUrl)&&(b=tt(v));const w=n(V,{accountProps:f,originProps:v}),T=r(a,{children:[y,b,w]}),A=(t=>JSON.parse(JSON.stringify(t)))({account:f,origin:v});return{id:await snap.request({method:"snap_createInterface",params:{ui:T,context:A}})}};class ct extends TypeError{constructor(t,e){let n;const{message:r,explanation:i,...o}=t,{path:a}=t,s=0===a.length?r:`At path: ${a.join(".")} -- ${r}`;super(i??s),null!=i&&(this.cause=s),Object.assign(this,o),this.name=this.constructor.name,this.failures=()=>n??(n=[t,...e()])}}function dt(t){return"object"==typeof t&&null!==t}function ut(t){return"symbol"==typeof t?t.toString():"string"==typeof t?JSON.stringify(t):`${t}`}function pt(t,e,n,r){if(!0===t)return;!1===t?t={}:"string"==typeof t&&(t={message:t});const{path:i,branch:o}=e,{type:a}=n,{refinement:s,message:l=`Expected a value of type \`${a}\`${s?` with refinement \`${s}\``:""}, but received: \`${ut(r)}\``}=t;return{value:r,type:a,refinement:s,key:i[i.length-1],path:i,branch:o,...t,message:l}}function*ht(t,e,n,r){(function(t){return dt(t)&&"function"==typeof t[Symbol.iterator]})(t)||(t=[t]);for(const i of t){const t=pt(i,e,n,r);t&&(yield t)}}function*mt(t,e,n={}){const{path:r=[],branch:i=[t],coerce:o=!1,mask:a=!1}=n,s={path:r,branch:i};if(o&&(t=e.coercer(t,s),a&&"type"!==e.type&&dt(e.schema)&&dt(t)&&!Array.isArray(t)))for(const n in t)void 0===e.schema[n]&&delete t[n];let l="valid";for(const r of e.validator(t,s))r.explanation=n.message,l="not_valid",yield[r,void 0];for(let[c,d,u]of e.entries(t,s)){const e=mt(d,u,{path:void 0===c?r:[...r,c],branch:void 0===c?i:[...i,d],coerce:o,mask:a,message:n.message});for(const n of e)n[0]?(l=null===n[0].refinement||void 0===n[0].refinement?"not_valid":"not_refined",yield[n[0],void 0]):o&&(d=n[1],void 0===c?t=d:t instanceof Map?t.set(c,d):t instanceof Set?t.add(d):dt(t)&&(void 0!==d||c in t)&&(t[c]=d))}if("not_valid"!==l)for(const r of e.refiner(t,s))r.explanation=n.message,l="not_refined",yield[r,void 0];"valid"===l&&(yield[void 0,t])}class ft{constructor(t){const{type:e,schema:n,validator:r,refiner:i,coercer:o=(t=>t),entries:a=function*(){}}=t;this.type=e,this.schema=n,this.entries=a,this.coercer=o,this.validator=r?(t,e)=>ht(r(t,e),e,this,t):()=>[],this.refiner=i?(t,e)=>ht(i(t,e),e,this,t):()=>[]}assert(t,e){return function(t,e,n){const r=vt(t,e,{message:n});if(r[0])throw r[0]}(t,this,e)}create(t,e){return function(t,e,n){const r=vt(t,e,{coerce:!0,message:n});if(r[0])throw r[0];return r[1]}(t,this,e)}is(t){return function(t,e){const n=vt(t,e);return!n[0]}(t,this)}mask(t,e){return function(t,e,n){const r=vt(t,e,{coerce:!0,mask:!0,message:n});if(r[0])throw r[0];return r[1]}(t,this,e)}validate(t,e={}){return vt(t,this,e)}}function vt(t,e,n={}){const r=mt(t,e,n),i=function(t){const{done:e,value:n}=t.next();return e?void 0:n}(r);if(i[0]){return[new ct(i[0],(function*(){for(const t of r)t[0]&&(yield t[0])})),void 0]}return[void 0,i[1]]}function gt(...t){const e="type"===t[0]?.type,n=t.map((({schema:t})=>t)),r=Object.assign({},...n);return e?function(t){const e=Object.keys(t);return new ft({type:"type",schema:t,*entries(n){if(dt(n))for(const r of e)yield[r,n[r],t[r]]},validator:t=>dt(t)||`Expected an object, but received: ${ut(t)}`,coercer:t=>dt(t)?{...t}:t})}(r):At(r)}function _t(t,e){return new ft({type:t,schema:null,validator:e})}function yt(){return _t("boolean",(t=>"boolean"==typeof t))}function bt(t){const e=ut(t),n=typeof t;return new ft({type:"literal",schema:"string"===n||"number"===n||"boolean"===n?t:null,validator:n=>n===t||`Expected the literal \`${e}\`, but received: ${ut(n)}`})}function wt(){return _t("never",(()=>!1))}function Tt(t){return new ft({...t,validator:(e,n)=>null===e||t.validator(e,n),refiner:(e,n)=>null===e||t.refiner(e,n)})}function At(t){const e=t?Object.keys(t):[],n=wt();return new ft({type:"object",schema:t??null,*entries(r){if(t&&dt(r)){const i=new Set(Object.keys(r));for(const n of e)i.delete(n),yield[n,r[n],t[n]];for(const t of i)yield[t,r[t],n]}},validator:t=>dt(t)||`Expected an object, but received: ${ut(t)}`,coercer:t=>dt(t)?{...t}:t})}function $t(t){return new ft({...t,validator:(e,n)=>void 0===e||t.validator(e,n),refiner:(e,n)=>void 0===e||t.refiner(e,n)})}function It(){return _t("string",(t=>"string"==typeof t||`Expected a string, but received: ${ut(t)}`))}function St(t){const e=t.map((t=>t.type)).join(" | ");return new ft({type:"union",schema:null,coercer(e){for(const n of t){const[t,r]=n.validate(e,{coerce:!0});if(!t)return r}return e},validator(n,r){const i=[];for(const e of t){const[...t]=mt(n,e,r),[o]=t;if(!o?.[0])return[];for(const[e]of t)e&&i.push(e)}return[`Expected the value to satisfy a union of \`${e}\`, but received: ${ut(n)}`,...i]}})}var kt;!function(t){t.ButtonClickEvent="ButtonClickEvent",t.FormSubmitEvent="FormSubmitEvent",t.InputChangeEvent="InputChangeEvent",t.FileUploadEvent="FileUploadEvent"}(kt||(kt={}));const Ct=At({type:It(),name:$t(It())}),jt=gt(Ct,At({type:bt(kt.ButtonClickEvent),name:$t(It())})),Ut=At({name:It(),size:_t("number",(t=>"number"==typeof t&&!isNaN(t)||`Expected a number, but received: ${ut(t)}`)),contentType:It(),contents:It()}),xt=gt(Ct,At({type:bt(kt.FormSubmitEvent),value:(Ot=It(),Nt=Tt(St([It(),Ut,yt()])),new ft({type:"record",schema:null,*entries(t){if(dt(t))for(const e in t){const n=t[e];yield[e,e,Ot],yield[e,n,Nt]}},validator:t=>dt(t)||`Expected an object, but received: ${ut(t)}`})),name:It()}));var Ot,Nt;const qt=gt(Ct,At({type:bt(kt.InputChangeEvent),name:It(),value:St([It(),yt()])})),Pt=(St([jt,xt,qt,gt(Ct,At({type:bt(kt.FileUploadEvent),name:It(),file:Tt(Ut)}))]),async({id:t,event:e,context:i})=>{if(e.type!==kt.ButtonClickEvent)return;const o=i;if("ai_summary"===e.name){var s,l,c;const e=null===(l=o)||void 0===l||null===(s=l.account)||void 0===s?void 0:s.address;if(!e)return;const r=(null===(c=o.account.account)||void 0===c?void 0:c.label)||e;await snap.request({method:"snap_updateInterface",params:{id:t,ui:n(N,{label:r})}});try{const i=await(async(t,e)=>{const n=p.hivemindApiUrl,r=new URLSearchParams({term:t});e&&r.set("termType",e);const i=`${n}/summary?${r.toString()}`,o=new AbortController,a=setTimeout((()=>o.abort()),3e4);try{return(await fetch(i,{signal:o.signal})).json()}finally{clearTimeout(a)}})(e,"address");i.success&&i.summary?await snap.request({method:"snap_updateInterface",params:{id:t,ui:n(q,{summary:i.summary,label:r})}}):await snap.request({method:"snap_updateInterface",params:{id:t,ui:n(P,{error:i.error||"No summary available for this address."})}})}catch(e){const r=e instanceof DOMException&&"AbortError"===e.name?"The request timed out. Please try again later.":"Failed to connect to summary service.";await snap.request({method:"snap_updateInterface",params:{id:t,ui:n(P,{error:r})}})}}else if("back"===e.name){if(!o)return;const e=(t=>{var e;const i=t.account,o=t.origin,s=Q(i);let l=null;"metamask"!==(null===(e=o)||void 0===e?void 0:e.originUrl)&&(l=tt(o));const c=n(V,{accountProps:i,originProps:o});return r(a,{children:[s,l,c]})})(o);await snap.request({method:"snap_updateInterface",params:{id:t,ui:e}})}}),Lt=async()=>({content:r(a,{children:[n(s,{children:"Welcome to Hive Mind, powered by Intuition"}),n(l,{children:"Real-time trust and sentiment insights for every transaction."}),n(c,{}),n(l,{children:"Hive Mind shows you community trust data from the Intuition knowledge graph during transactions."}),r(a,{children:[n(d,{href:"https://hivemindhq.io",children:"Check out Hive Mind's product suite"}),n(d,{href:"https://intuition.systems",children:"Learn about Intuition"})]})]})});var Et=exports;for(var Wt in e)Et[Wt]=e[Wt];e.__esModule&&Object.defineProperty(Et,"__esModule",{value:!0})})();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hivemindhq/snap",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.4.0",
|
|
4
4
|
"description": "Real-time trust and sentiment insights for every transaction. Powered by Intuition",
|
|
5
5
|
"contributors": [
|
|
6
6
|
{
|
|
@@ -21,7 +21,8 @@
|
|
|
21
21
|
],
|
|
22
22
|
"scripts": {
|
|
23
23
|
"allow-scripts": "yarn workspace root allow-scripts",
|
|
24
|
-
"build": "mm-snap build",
|
|
24
|
+
"build": "echo '🔗 Chain: TESTNET (default)' && mm-snap build",
|
|
25
|
+
"build:mainnet": "echo '🔗 Chain: MAINNET' && CHAIN=mainnet mm-snap build",
|
|
25
26
|
"build:clean": "yarn clean && yarn build",
|
|
26
27
|
"clean": "rimraf dist",
|
|
27
28
|
"lint": "yarn lint:eslint && yarn lint:misc --check",
|
|
@@ -30,9 +31,9 @@
|
|
|
30
31
|
"lint:misc": "prettier '**/*.json' '**/*.md' '!CHANGELOG.md' --ignore-path .gitignore",
|
|
31
32
|
"prepublishOnly": "mm-snap manifest",
|
|
32
33
|
"serve": "mm-snap serve",
|
|
33
|
-
"start": "CHAIN=testnet mm-snap watch",
|
|
34
|
-
"start:mainnet": "CHAIN=mainnet mm-snap watch",
|
|
35
|
-
"start:testnet": "CHAIN=testnet mm-snap watch",
|
|
34
|
+
"start": "echo '🔗 Chain: TESTNET (testnet.intuition.sh)' && CHAIN=testnet mm-snap watch",
|
|
35
|
+
"start:mainnet": "echo '🔗 Chain: MAINNET (mainnet.intuition.sh)' && CHAIN=mainnet mm-snap watch",
|
|
36
|
+
"start:testnet": "echo '🔗 Chain: TESTNET (testnet.intuition.sh)' && CHAIN=testnet mm-snap watch",
|
|
36
37
|
"test": "jest",
|
|
37
38
|
"test:watch": "jest --watch",
|
|
38
39
|
"test:integration": "jest --testPathPattern=onTransaction.test",
|
package/snap.manifest.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "1.
|
|
2
|
+
"version": "1.4.0",
|
|
3
3
|
"description": "Community trust signals for every transaction, powered by Intuition.",
|
|
4
4
|
"proposedName": "Hive Mind",
|
|
5
5
|
"repository": {
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
"url": "https://github.com/hivemindhq-io/snap"
|
|
8
8
|
},
|
|
9
9
|
"source": {
|
|
10
|
-
"shasum": "
|
|
10
|
+
"shasum": "43OKg7+FZRA2W+2KywARzKyN1q2iS65+89w5QoSI7vY=",
|
|
11
11
|
"location": {
|
|
12
12
|
"npm": {
|
|
13
13
|
"filePath": "dist/bundle.js",
|