123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403 |
- <template>
- <main class="flex flex-col">
- <h1 class="w-full text-4xl text-center font-bold mt-5 p-3 border-b-4 border-gray-500">
- SLPDB Lab
- </h1>
- <!-- Page Section -->
- <section class="w-full h-full flex">
- <div class="w-1/2 bg-rose-500">
- code window
- <select @change="selectQuery" v-model="selected">
- <option value="default">Default</option>
- <option value="addr-balance">Address balances by token</option>
- <option value="token-balance">Token balances by address</option>
- <option value="txs-address">Transactions by address</option>
- <option value="tokens-sent">Tokens sent</option>
- <option value="token-info">Token info</option>
- <option value="utxos-token">UTXOs by token</option>
- <option value="swap">Signal, Watch & Pay (SWaP)</option>
- <option value="sipnet">Gossip Network</option>
- </select>
- <a href="https://status.slpdb.io" target="_blank">
- https://status.slpdb.io
- </a>
- <textarea class="w-full h-96" v-model="userQuery" />
- <button @click="query" class="ml-5 mt-3 p-3 text-center text-lg font-medium bg-pink-300 border-4 border-pink-500 rounded-xl">
- Send Query
- </button>
- </div>
- <div class="w-1/2 bg-yellow-300 overflow-x-scroll overflow-y-scroll">
- instructions & output
- <pre v-html="output" />
- </div>
- </section>
- </main>
- </template>
- <script>
- /* Import modules. */
- // import Nito from 'nitojs'
- /* Import components. */
- // import UnderConstruction from '@/components/UnderConstruction'
- export default {
- components: {
- // UnderConstruction,
- },
- data: () => {
- return {
- requests: null,
- selected: null,
- output: null,
- userQuery: null,
- }
- },
- computed: {
- //
- },
- methods: {
- async query() {
- console.log('SEND QUERY')
- /* Clear output. */
- this.output = ''
- let request
- if (this.userQuery) {
- try {
- // NOTE: We remove "helpful" comment.
- const pos = this.userQuery.indexOf('{')
- let userQuery
- if (pos) {
- userQuery = this.userQuery.slice(pos)
- } else {
- userQuery = this.userQuery
- }
- request = JSON.parse(userQuery)
- } catch (err) {
- console.error(err)
- }
- } else {
- request = this.requests[0]
- }
- console.log('REQUEST', request)
- // const response = await fetch()
- const response = await Nito.SLP.Query.request(request)
- .catch(err => console.error(err))
- console.log('RESPONSE (body):', response)
- this.output = JSON.stringify(response, null, 2)
- },
- selectQuery() {
- console.log('SELECTED', this.selected)
- switch(this.selected) {
- case 'addr-balance':
- return this.loadAddrBalance()
- case 'token-balance':
- return this.loadTokenBalance()
- case 'txs-address':
- return this.loadTxsAddress()
- case 'tokens-sent':
- return this.loadTokensSent()
- case 'token-info':
- return this.loadTokenInfo()
- case 'utxos-token':
- return this.loadUtxosByToken()
- case 'swap':
- return this.loadSwap()
- case 'sipnet':
- return this.loadSipnet()
- default:
- return this.loadDefault()
- }
- },
- loadDefault() {
- this.userQuery = `/* Customize your query below. */
- {
- "v": 3,
- "q": {
- "find": {},
- "limit": 10
- }
- }
- `
- },
- loadAddrBalance() {
- this.userQuery = `/* Customize your query below. */
- {
- "v": 3,
- "q": {
- "db": ["g"],
- "aggregate": [
- {
- "$match": {
- "tokenDetails.tokenIdHex": "7cf3c06b85ce9fa611098d78551ce13f5cdd345db2041f2d942438fb4ce80ee8"
- }
- },
- {
- "$unwind": "$graphTxn.outputs"
- },
- {
- "$match": {
- "graphTxn.outputs.status": "UNSPENT"
- }
- },
- {
- "$group": {
- "_id": "$graphTxn.outputs.address",
- "slpAmount": {
- "$sum": "$graphTxn.outputs.slpAmount"
- }
- }
- },
- {
- "$match": {
- "slpAmount": {
- "$gt": 0
- }
- }
- }
- ],
- "sort": {
- "slpAmount": -1
- },
- "project": {
- "address": "$_id",
- "token_balance": "$slpAmount"
- },
- "limit": 10,
- "skip": 0
- }
- }
- `
- },
- loadTokenBalance() {
- this.userQuery = `/* Customize your query below. */
- {
- "v": 3,
- "q": {
- "db": ["g"],
- "aggregate": [
- {
- "$match": {
- "graphTxn.outputs.address": "simpleledger:pz8kpuypq2m55q9yuj9pv6r7hvzz8t4mrygmjzrnjq"
- }
- },
- {
- "$unwind": "$graphTxn.outputs"
- },
- {
- "$match": {
- "graphTxn.outputs.status": "UNSPENT",
- "graphTxn.outputs.address": "simpleledger:pz8kpuypq2m55q9yuj9pv6r7hvzz8t4mrygmjzrnjq"
- }
- }
- ]
- }
- }
- `
- },
- loadTxsAddress() {
- this.userQuery = `/* Customize your query below. */
- {
- "v": 3,
- "q": {
- "db": ["c"],
- "aggregate": [
- {
- "$match": {
- "$and": [
- {"slp.valid": true},
- {
- "$or": [
- {"in.e.a": "simpleledger:pz8kpuypq2m55q9yuj9pv6r7hvzz8t4mrygmjzrnjq"},
- {"out.e.a": "simpleledger:pz8kpuypq2m55q9yuj9pv6r7hvzz8t4mrygmjzrnjq"}
- ]
- }
- ]
- }
- },
- {
- "$sort": {"blk.i": -1}
- },
- {
- "$skip": 0
- },
- {
- "$limit": 100
- },
- {
- "$lookup": {
- "from": "tokens",
- "localField": "slp.detail.tokenIdHex",
- "foreignField": "tokenDetails.tokenIdHex",
- "as": "token"
- }
- },
- {
- "$lookup": {
- "from": "graphs",
- "localField": "tx.h",
- "foreignField": "graphTxn.txid",
- "as": "graph"
- }
- }
- ],
- "limit": 100
- }
- }
- `
- },
- loadTokensSent() {
- this.userQuery = `/* Customize your query below. */
- {
- "v": 3,
- "q": {
- "db": ["c"],
- "find": {
- "$and": [
- {"slp.valid": true},
- {"slp.detail.tokenIdHex": "7cf3c06b85ce9fa611098d78551ce13f5cdd345db2041f2d942438fb4ce80ee8"},
- {"slp.detail.transactionType": "SEND"}
- ]
- },
- "sort": {"blk.i": -1},
- "limit": 100,
- "skip": 0
- },
- "r": {
- "f": "[ .[] | { slp } ]"
- }
- }
- `
- },
- loadTokenInfo() {
- this.userQuery = `/* Customize your query below. */
- {
- "v": 3,
- "q": {
- "db": ["t"],
- "find": {
- "tokenDetails.tokenIdHex": "7cf3c06b85ce9fa611098d78551ce13f5cdd345db2041f2d942438fb4ce80ee8"
- },
- "limit": 1
- }
- }
- `
- },
- loadUtxosByToken() {
- this.userQuery = `/* Customize your query below. */
- {
- "v": 3,
- "q": {
- "db": ["g"],
- "aggregate": [
- {
- "$match": {
- "tokenDetails.tokenIdHex": "7cf3c06b85ce9fa611098d78551ce13f5cdd345db2041f2d942438fb4ce80ee8",
- "graphTxn.outputs.address": "simpleledger:pz8kpuypq2m55q9yuj9pv6r7hvzz8t4mrygmjzrnjq",
- "graphTxn.outputs.status": {
- "$in": [
- "UNSPENT",
- "BATON_UNSPENT"
- ]
- }
- }
- },
- {
- "$unwind": "$graphTxn.outputs"
- },
- {
- "$match": {
- "graphTxn.outputs.status": {
- "$in": [
- "UNSPENT",
- "BATON_UNSPENT"
- ]
- },
- "graphTxn.outputs.slpAmount": {
- "$gt": 0
- }
- }
- }
- ]
- }
- }
- `
- },
- loadSwap() {
- this.userQuery = `/* Customize your query below. */
- {
- "v": 3,
- "q": {
- "find": {
- "out.h1": "53575000"
- },
- "limit": 10
- }
- }
- `
- },
- loadSipnet() {
- this.userQuery = `/* Customize your query below. */
- {
- "v": 3,
- "q": {
- "find": {
- "out.h1": "53495000"
- },
- "limit": 10
- }
- }
- `
- },
- },
- created: async function () {
- this.requests = []
- let request
- request = {
- v: 3,
- q: {
- find: {},
- limit: 10
- }
- }
- this.requests.push(request)
- },
- mounted: function () {
- //
- },
- }
- </script>
|