|
| 1 | +const serverless = require('serverless-http') |
| 2 | +const axios = require('axios') |
| 3 | +const IPFS = require('ipfs-api') |
| 4 | +const express = require('express') |
| 5 | +const cors = require('cors') |
| 6 | +const _ = require('lodash') |
| 7 | + |
| 8 | +const ipfs = new IPFS({ |
| 9 | + host: 'ipfs.infura.io', |
| 10 | + port: 5001, |
| 11 | + protocol: 'https' |
| 12 | +}) |
| 13 | + |
| 14 | +const test = async () => console.log(await ipfs.add(Buffer.from(JSON.stringify({oi : 'oi'})))) |
| 15 | +//test() |
| 16 | +const testnet = { |
| 17 | + objkts: 'KT1XFvSpHLUqtR1wyTwR8GJ2GswFJHfamGvT', |
| 18 | + ledgerPtr: 74453, |
| 19 | + metadataPtr: 74456, |
| 20 | + network: 'delphinet', |
| 21 | + protocol: 'KT1QfY5MgsbFayqSqvn7EJangrUAF4xt4B49', |
| 22 | + swapsPtr: 74465 |
| 23 | +} |
| 24 | + |
| 25 | +const mainnet = { |
| 26 | + objkts: 'KT1RJ6PbjHpwc3M5rw5s2Nbmefwbuwbdxton', |
| 27 | + ledgerPtr: 511, |
| 28 | + metadataPtr: 514, |
| 29 | + network: 'mainnet', |
| 30 | + protocol: 'KT1Hkg5qeNhfwpKW4fXvq7HGZB9z2EnmCCA9', |
| 31 | + swapsPtr: 523, |
| 32 | + hDAO : 'KT1AFA2mwNUMNd4SsujE1YYp29vd8BZejyKW', |
| 33 | + curations : 'KT1TybhR7XraG75JFYKSrh7KnxukMBT5dor6', |
| 34 | + curationsPtr : 519, |
| 35 | + royaltiesPtr : 522, |
| 36 | + ledgerPtr2 : 515 |
| 37 | +} |
| 38 | + |
| 39 | +const getStorage = async (config, kt) => { |
| 40 | + await axios.get(`https://better-call.dev/v1/contract/${config.network}/${kt}/storage`).then(res => console.log(res.data)) |
| 41 | +} |
| 42 | + |
| 43 | +//getStorage(mainnet, mainnet.curations) |
| 44 | + |
| 45 | +const getSwaps = async (config) => { |
| 46 | + return await axios.get(`https://better-call.dev/v1/bigmap/${config.network}/${config.swapsPtr}/keys?size=2000`).then(res => { |
| 47 | + return (res.data).map(e => { |
| 48 | + var obj = {} |
| 49 | + obj['swap_id'] = e.data.key.value |
| 50 | + e.data.value != null ? e.data.value.children.map(e => obj[e.name] = e.value) : null |
| 51 | + return obj |
| 52 | + }) |
| 53 | + }) |
| 54 | +} |
| 55 | +/* .map(e => e.data.value != null ? (e.data.value.children).map(e => { return { key : e.name, value : e.value }} ) : null )) */ |
| 56 | + |
| 57 | +const getObjktLedger = async (config) => { |
| 58 | + return await axios.get(`https://better-call.dev/v1/bigmap/${config.network}/${config.ledgerPtr}/keys?size=2000`).then(res => res.data.map(e => ({ amount: parseInt(e.data.value.value), tz: e.data.key.children[0].value, tk_id: parseInt(e.data.key.children[1].value) }))) |
| 59 | +} |
| 60 | + |
| 61 | +const getObjktMetadata = async (config) => { |
| 62 | + return await axios.get(`https://better-call.dev/v1/bigmap/${config.network}/${config.metadataPtr}/keys?size=2000`).then(res => res.data.map(e => ({ tk_id: parseInt(e.data.key.value), metadata: e.data.value.children[1].children[0].value.split('//')[1] }))) |
| 63 | +} |
| 64 | + |
| 65 | +const getObjktLedgerOffset = async (config, offset) => { return await axios.get(`https://better-call.dev/v1/bigmap/${config.network}/${config.metadataPtr}/keys?offset=${offset * 10}`).then(res => res.data.map(e => ({ amount: parseInt(e.data.value.value), tz: e.data.key.children[0].value, tk_id: parseInt(e.data.key.children[1].value) }))) } |
| 66 | + |
| 67 | +const objktById = async (config, id, res) => { |
| 68 | + |
| 69 | + var ledger = await getObjktLedger(config) |
| 70 | + var objkt = feed(ledger).filter(e => e.tk_id == id) |
| 71 | + var metadata = await getObjktMetadata(config) |
| 72 | + var swaps = await getSwaps(config) |
| 73 | + var addrs = await owners(id) |
| 74 | + console.log(objkt) |
| 75 | + //objkt = [objkt[0].owners = addrs] |
| 76 | + //console.log('objktId', id, merge(objkt, metadata)) |
| 77 | + readMetadata(mergeSwaps(merge(objkt, metadata), swaps), res) |
| 78 | +} |
| 79 | + |
| 80 | +// get lower swap prices |
| 81 | + |
| 82 | +const getFeed = async (config, offset, res) => { |
| 83 | + |
| 84 | + var ledger = await getObjktLedger(config) |
| 85 | + var metadata = await getObjktMetadata(config) |
| 86 | + var swaps = await getSwaps(config) |
| 87 | + |
| 88 | + |
| 89 | + //console.log(mergeSwaps(ledger, swaps)) |
| 90 | + //console.log(feed(desc(ledger))) |
| 91 | + //console.log(desc(feed(merge(ledger, metadata)))) |
| 92 | + //console.log(merge(ledger, metadata)) |
| 93 | + //console.log(ledger) |
| 94 | + //console.log(await updateAmount(ledger)) |
| 95 | + //mergePromise(updateAmount(feed(merge(ledger, metadata)))) |
| 96 | + //console.log(mergeSwaps(merge(offsetFunction(feed(desc(ledger)), offset), metadata), swaps)) |
| 97 | + //mergePromise(updateAmount(merge(offsetFunction(desc(ledger), offset), metadata))) |
| 98 | + |
| 99 | + readMetadata(mergeSwaps(merge(offsetFunction(feed(desc(ledger)), offset), metadata), swaps), res) |
| 100 | + |
| 101 | +} |
| 102 | + |
| 103 | + |
| 104 | +/* const mergePromise = async (arg1, arg2) => { |
| 105 | +
|
| 106 | + var promise = Promise.all([arg1.map(e => e), arg2.map(e => e)) |
| 107 | + promise.then(results => { |
| 108 | + results.map(e => console.log(e)) |
| 109 | + }) |
| 110 | +} */ |
| 111 | + |
| 112 | +const getTzLedger = async (config, tz, res) => { |
| 113 | + var ledger = await getObjktLedger(config) |
| 114 | + var metadata = await getObjktMetadata(config) |
| 115 | + var swaps = await getSwaps(config) |
| 116 | + |
| 117 | + var filtered = filter(merge(ledger, metadata), tz) |
| 118 | + //updateAmount(filtered) |
| 119 | + readMetadata(mergeSwaps(filtered, swaps), res) |
| 120 | + |
| 121 | + // profile info |
| 122 | + |
| 123 | +} |
| 124 | + |
| 125 | +const readMetadata = (arr, res) => { |
| 126 | + |
| 127 | + var arr = arr.map(async e => { |
| 128 | + e.metadata = (JSON.parse(JSON.stringify((await ipfs.files.get(e.metadata))[0].content.toString('utf-8')))) |
| 129 | + return e |
| 130 | + }) |
| 131 | + |
| 132 | + /* resolve promise and dispatch answer */ |
| 133 | + |
| 134 | + var promise = Promise.all(arr.map(e => e)) |
| 135 | + promise.then((results) => { |
| 136 | + aux_arr = results.map(e => e) |
| 137 | + |
| 138 | + aux_arr = aux_arr.map(async e1 => { |
| 139 | + e1.total_amount = 0 |
| 140 | + var aux_arr = (await getObjktLedger(mainnet)) |
| 141 | + aux_arr.map(e2 => parseInt(e1.tk_id) == parseInt(e2.tk_id) ? e1.total_amount += e2.amount : null) |
| 142 | + return e1 |
| 143 | + }) |
| 144 | + |
| 145 | + var internalPromise = Promise.all(aux_arr.map(e => e)) |
| 146 | + internalPromise.then((results) => { |
| 147 | + aux_arr2 = results.map(e => e) |
| 148 | + |
| 149 | + res.json({ result : jsonParse(aux_arr2) }) |
| 150 | + }) |
| 151 | + //console.log(jsonParse(aux_arr)) |
| 152 | + //res.json({ result : jsonParse(aux_arr) }) |
| 153 | + //console.log(aux_arr) |
| 154 | + /* feed order */ |
| 155 | + //console.log(aux_arr) |
| 156 | +// func != null ? func(desc(aux_arr)) : desc(aux_arr) // treat json metadata |
| 157 | + |
| 158 | + }) |
| 159 | + |
| 160 | + /* height */ |
| 161 | + |
| 162 | +} |
| 163 | + |
| 164 | +const owners = async (id) => { |
| 165 | + const ledger = await getObjktLedger(testnet) |
| 166 | + return ledger.filter(e => e.tk_id == id) |
| 167 | +} |
| 168 | + |
| 169 | +const updateAmount = async (arr) => { |
| 170 | + |
| 171 | + //console.log(arr) |
| 172 | + |
| 173 | + var arr = arr.map(async e1 => { |
| 174 | + e1.total_amount = 0 |
| 175 | + var aux_arr = (await getObjktLedger(testnet)) |
| 176 | + aux_arr.map(e2 => e1.tk_id == e2.tk_id ? e1.total_amount += e2.amount : null) |
| 177 | + //console.log(e1) |
| 178 | + return e1 |
| 179 | + }) |
| 180 | + |
| 181 | + var aux_arr = [] |
| 182 | + |
| 183 | + var promise = Promise.all(arr.map(e => e)) |
| 184 | + promise.then((results) => { |
| 185 | + aux_arr = results.map(e => e) |
| 186 | + console.log(aux_arr) |
| 187 | +/* aux_arr.map(async e => { |
| 188 | + var res = e.metadata.formats[0].mimeType == 'text/plain' ? await axios.get(e.metadata.formats[0].uri).then(res => res.data) : null |
| 189 | + res != null ? e.metadata.text = res : null |
| 190 | + //console.log(e) |
| 191 | + }) */ |
| 192 | + |
| 193 | + //console.log(aux_arr) |
| 194 | + |
| 195 | + }) |
| 196 | +} |
| 197 | + |
| 198 | +/* aux functions */ |
| 199 | + |
| 200 | +// feed desc order |
| 201 | +const desc = arr => _.sortBy(arr, o => o.tk_id).reverse() |
| 202 | + |
| 203 | +// get lower price from swaps |
| 204 | + |
| 205 | +const mergeSwaps = (arr, swaps) => { |
| 206 | + arr.forEach((e1) => { |
| 207 | + |
| 208 | + e1.swaps = [] |
| 209 | + |
| 210 | + swaps.forEach((e2) => { |
| 211 | + if (parseInt(e1.tk_id) === parseInt(e2.objkt_id)) { |
| 212 | + e1.swaps.push(e2) |
| 213 | + } |
| 214 | + }) |
| 215 | + }) |
| 216 | + return arr |
| 217 | +} |
| 218 | + |
| 219 | +// offset |
| 220 | + |
| 221 | +const offsetFunction = (arr, set) => arr.slice(set * 5, set * 5 + 5) |
| 222 | + |
| 223 | +const jsonParse = arr => arr.map(e => { return { ...e, metadata: JSON.parse(e.metadata) } }) |
| 224 | + |
| 225 | +const filter = (data, tz) => _.filter(data, { tz: tz }) |
| 226 | + |
| 227 | +const feed = (data) => (_.uniqBy(data, 'tk_id')) |
| 228 | + |
| 229 | +const getText = async (url) => await axios.get(url).then(res => res.data) |
| 230 | + |
| 231 | +const merge = (a, b) => { |
| 232 | + a.forEach((e1) => { |
| 233 | + b.forEach((e2) => { |
| 234 | + if (e1.tk_id === e2.tk_id) { |
| 235 | + _.assign(e1, e2) |
| 236 | + } |
| 237 | + }) |
| 238 | + }) |
| 239 | + return a |
| 240 | +} |
| 241 | + |
| 242 | +//getLedgerPtrs(objkts_testnet, 'delphinet') |
| 243 | +//getObjktLedger(testnet) |
| 244 | +//getObjktMetadata('delphinet') |
| 245 | +//getTzLedger(testnet, 'tz1Zz4MmtM6mpzh5XWiAEXGeP9iWsT7PSmzg') |
| 246 | +//getFeed(testnet, 2) |
| 247 | +//getObjktLedgerOffset(testnet) |
| 248 | +//getSwaps(testnet) |
| 249 | +//objktById(mainnet, 154) |
| 250 | +//getFeed(mainnet, 0) |
| 251 | +//getTzLedger(mainnet, 'tz1UBZUkXpKGhYsP5KtzDNqLLchwF4uHrGjw') |
| 252 | + |
| 253 | +const app = express() |
| 254 | + |
| 255 | +app.use(express.json()) |
| 256 | +app.use(cors({origin : '*'})) |
| 257 | + |
| 258 | +app.post('/feed', (req, res) => { |
| 259 | + getFeed(mainnet, req.body.counter, res) |
| 260 | +}) |
| 261 | + |
| 262 | +app.post('/tz', (req, res) => { |
| 263 | + getTzLedger(mainnet, req.body.tz, res) |
| 264 | +}) |
| 265 | + |
| 266 | +app.post('/objkt', (req, res) => { |
| 267 | + objktById(mainnet, parseInt(req.body.id), res) |
| 268 | +}) |
| 269 | + |
| 270 | +module.exports.handler = serverless(app) |
0 commit comments