‘Smart Person Is Dumb’

Score: 4/5

This felt quite short, or I raced through it somehow. Nice and readable, but still fairly light. (Yeah, I still miss Iain M. Banks and The Culture.)

It did feel a bit of a daft premise though. We have researchers now dedicating their lives to figuring out the problem of alignment of godlike AIs (even though we don’t have such godlike AIs yet), we have myths and legends of genies, we have fables of people getting their comeuppance by getting exactly what they asked for... Do people in the future not have these things, or do they just not think things through? People who are otherwise smart being really dumb tends to break my suspension of disbelief.

Tags: 4 Word Book Reviews
Created by on Logo15659OpinionatedGeek Ltd.Logo15659

‘What’s Not To Love?’

Score: 4/5

Another romp with the Moscow Watch. Some enemies become allies, some new enemies appear, and some nice bits to keep you guessing. What’s not to love?

Tags: 4 Word Book Reviews
Created by on Logo15659OpinionatedGeek Ltd.Logo15659

‘More Of The Same’

Score: 3/5

I think I've run out of steam with this series. There's only so many times we can do the 'sergeant outsmarts hyperintelligent AI' before it gets repetitive and predictable. The author tried to shake things up this time with different perspectives for some chapters, but it didn't really work for me. Ah well.

Tags: 4 Word Book Reviews
Created by on Logo15659OpinionatedGeek Ltd.Logo15659

I’ve been playing around with Serum Swap pools since they were launched a couple of days ago.

The idea is simple - like Uniswap on Ethereum, Swap maintains two pools of tokens and you can ‘buy’ some tokens from one pool by paying tokens to the other pool. The ratio of tokens in the two pools is fixed, which allows you to calculate how much of one token to ‘pay’ for the other token.

It’s hard finding much documentation on how to query the pools, but they’re on a blockchain with a public API so I figured I’d have a go. After a few false starts and some answers from the dev discussion forum, here’s a basic script that reports the pool balances and total supply of pool tokens for each swap.

#! /usr/bin/env node
/* eslint-disable no-empty, no-console, no-await-in-loop, no-magic-numbers, max-lines-per-function, max-statements */

"use strict";

const BN = require("bn.js");
const BufferLayout = require("buffer-layout");
const serum = require("@project-serum/serum");
const solana = require("@solana/web3.js");
const MAINNET_API = "https://api.mainnet-beta.solana.com"; const ROOT_POOL_ADDRESS = "9qvG1zUp8xF1Bi4m6UdRNby1BAAuaDrUxSpv4CmRRMjL"; const PUBLIC_KEY_LENGTH = 32; const INT_LENGTH = 8; const PADDING_LENGTH = 16;
const TokenSwapLayout = BufferLayout.struct([ BufferLayout.u8("isInitialized"), BufferLayout.u8("nonce"), BufferLayout.blob(PUBLIC_KEY_LENGTH, "tokenProgramId"), BufferLayout.blob(PUBLIC_KEY_LENGTH, "tokenAccountA"), BufferLayout.blob(PUBLIC_KEY_LENGTH, "tokenAccountB"), BufferLayout.blob(PUBLIC_KEY_LENGTH, "tokenPool"), BufferLayout.blob(PUBLIC_KEY_LENGTH, "mintA"), BufferLayout.blob(PUBLIC_KEY_LENGTH, "mintB"), BufferLayout.blob(PUBLIC_KEY_LENGTH, "feeAccount"), BufferLayout.u8("curveType"), BufferLayout.blob(INT_LENGTH, "tradeFeeNumerator"), BufferLayout.blob(INT_LENGTH, "tradeFeeDenominator"), BufferLayout.blob(INT_LENGTH, "ownerTradeFeeNumerator"), BufferLayout.blob(INT_LENGTH, "ownerTradeFeeDenominator"), BufferLayout.blob(INT_LENGTH, "ownerWithdrawFeeNumerator"), BufferLayout.blob(INT_LENGTH, "ownerWithdrawFeeDenominator"), BufferLayout.blob(PADDING_LENGTH, "padding") ]); function bnFromBuffer(buffer) { return new BN( [...buffer] .reverse() .map((value) => `00${value.toString(16)}`.slice(-2)) .join(""), 16 ); } function expandTokenSwapMetadata(initial) { const expanded = {}; expanded.isInitialized = initial.isInitialized; expanded.nonce = initial.nonce; expanded.curveType = initial.curveType; expanded.tokenProgramId = new solana.PublicKey(initial.tokenProgramId); expanded.tokenAccountA = new solana.PublicKey(initial.tokenAccountA); expanded.tokenAccountB = new solana.PublicKey(initial.tokenAccountB); expanded.tokenPool = new solana.PublicKey(initial.tokenPool); expanded.mintA = new solana.PublicKey(initial.mintA); expanded.mintB = new solana.PublicKey(initial.mintB); expanded.feeAccount = new solana.PublicKey(initial.feeAccount); expanded.tradeFeeNumerator = bnFromBuffer(initial.tradeFeeNumerator); expanded.tradeFeeDenominator = bnFromBuffer(initial.tradeFeeDenominator); expanded.ownerTradeFeeNumerator = bnFromBuffer(initial.ownerTradeFeeNumerator); expanded.ownerTradeFeeDenominator = bnFromBuffer(initial.ownerTradeFeeDenominator); expanded.ownerWithdrawFeeNumerator = bnFromBuffer(initial.ownerWithdrawFeeNumerator); expanded.ownerWithdrawFeeDenominator = bnFromBuffer(initial.ownerWithdrawFeeDenominator); return expanded; } async function fetchBalanceAndMetadata(connection, mint, source) { const tokenMetadata = serum.TOKEN_MINTS.find((tok) => tok.address.equals(mint)); const balance = await connection.getTokenAccountBalance(source); return { balance: balance.value.uiAmount, name: tokenMetadata?.name ?? "«Unknown»", mint, source }; } function decribePool(tokenPool, supply, tokenA, tokenB) { return ` ${tokenA.name}/${tokenB.name} «${tokenPool.toString().padEnd(44)}» Total Pool Token Supply: ${supply.value.uiAmount.toString().padStart(16)} «${tokenA.source.toString().padEnd(44)}» [${tokenA.name.padEnd(9)}] Balance: ${tokenA.balance.toString().padStart(20)} «${tokenB.source.toString().padEnd(44)}» [${tokenB.name.padEnd(9)}] Balance: ${tokenB.balance.toString().padStart(20)} `; } async function main() { const connection = new solana.Connection(MAINNET_API); const poolProgramId = new solana.PublicKey(ROOT_POOL_ADDRESS); const pools = await connection.getProgramAccounts(poolProgramId); for (const pool of pools) { const {data} = pool.account; if (data.length === TokenSwapLayout.span) { const decoded = TokenSwapLayout.decode(data); const tokenSwap = expandTokenSwapMetadata(decoded); const supply = await connection.getTokenSupply(tokenSwap.tokenPool); const tokenA = await fetchBalanceAndMetadata(connection, tokenSwap.mintA, tokenSwap.tokenAccountA); const tokenB = await fetchBalanceAndMetadata(connection, tokenSwap.mintB, tokenSwap.tokenAccountB); console.log(decribePool(tokenSwap.tokenPool, supply, tokenA, tokenB)); } else { console.log(`Unknown token swap layout for PublicKey: ${pool.pubkey}`); } } } main().catch((ex) => console.error(ex));

You’re on your own if you try to run this basic node script, but it should be obvious what packages you need.

It shows how to decode the layout of the returned data, and converts some of it to more appropriate types. It then queries the supply and balances.

Here’s the output as of 16:15 on 2020-10-29:

LINK/USDC
«7Dpa38bfdsGPmoWYkxCwRv48DczK35Go7KAdC9J7gzy3» Total Pool Token Supply: 10.00018873
«6myJHLHQPJrdrZaABXAouGGnyWMbGVYa8RE4ttgfKwtr» [LINK ] Balance: 8444.936758
«DQHyB8iMJbk2Ac3qCV1v22MoU7kiQCQ396xSqBrjLt7N» [USDC ] Balance: 97737.557302

SRM/UNI
«Ap9qKcpUN4a4gArf8i7XC9Qnvduujj7cqJRV4oVEhzZK» Total Pool Token Supply: 0
«3gLPoXA2SE8anTf9xL5LiofpYsFGFrPCmGJkJN9xQSVv» [SRM ] Balance: 0
«AJXmcezaT8CfY7S6twaGY5nPD7KPpEy7ep2C8MXuViWG» [UNI ] Balance: 0

SOL/BTC
«9R3t7ZXPCEe7z9U3kgKgxiD7uSV1KzKHpMB78SmnZezu» Total Pool Token Supply: 10.00000489
«D5HfT6yELuMt9Ljx9XfLkkVzheyQ6GLgGyoZjcU6YNaY» [SOL ] Balance: 0.0501
«t3vB7bLSJ9sbvpFsuS7Uh46pFXDWUhVyV1217ukPtxx » [BTC ] Balance: 0.000007

SRM/«Unknown»
«8g9JvkTs4xdVWY54uG8pVeZ8wf1UMQK13FxATxR1jTYo» Total Pool Token Supply: 0
«5NeFGFkbM2ePpMbeQQgvRA7xkMchXCAi4MqnymX4y964» [SRM ] Balance: 0
«A6AapjxXigbJH1tN4Wzadj8tTJmS83uPqV1STgiFZyzQ» [«Unknown»] Balance: 0

ALEPH/SOL
«3XSibQKankpsa4AdxAKmM2WbZCES91wDZDz3YfjrgqWP» Total Pool Token Supply: 0
«Dj6wSHiCDewWRvcuTdB6b4fUx29Qwb3WsHzPuGKCq9Rk» [ALEPH ] Balance: 0
«GnvfEjtzvLphYr5XRqGUQBTUcKpgPYs6ybRsoumcyqBy» [SOL ] Balance: 0

SOL/USDC
«Htr2t746VeshhkTxd1Kyv1ictR9hPZ9811Wg8rAXhinK» Total Pool Token Supply: 441854.49203689
«3sRavwSu5dmCjXnu66Y1Phe93MXwUC1Q8Kqi2eh9dWnL» [SOL ] Balance: 47646.542348491
«5t9sxN488df2SbCJen3YBV3koLfPJSkdhbGBEK8MSZXo» [USDC ] Balance: 73793.88432

SRM/LINK
«Gjp8DQoZSCnAbUGRpLUwe1Tgg4iKG6Hjan2EW4ZPoddo» Total Pool Token Supply: 20.06073856
«E3QcD6KX5FmFNiWn4D4pQdw97F9MBLVzMh2VdpfZDKpm» [SRM ] Balance: 202468.453948
«9be2S66Xw4HrJfjsWaZNiKztA4AXPZfuWfS93x4HcbS7» [LINK ] Balance: 17647.548355

SRM/«Unknown»
«6b44fKL4RSSr194kBwhKt6DC5cjHBi2q744o6SjBy4bf» Total Pool Token Supply: 10
«7aJCVuEQSbtAhzkcq376KDXCSqMaVZvd67PgsUqyAjdq» [SRM ] Balance: 0.01
«FL9kB2NdjxfkAk27gDSvfFGB6yScvN8TiFv219JKWbct» [«Unknown»] Balance: 0.0001

SRM/USDC
«GfnWGHHfVqvGAF9ovNfqTn9PgV1XL33YSFXjTCZbJS97» Total Pool Token Supply: 23.83954159
«i3D9kpwMznhtiN4TMzLv3rvzsNHEcuZAjkURjq5L44G » [SRM ] Balance: 236454.306723
«2fQLHivdMZ8FxhFjFVMTMjGikXkz6tqu4KskDvY2kr8k» [USDC ] Balance: 238658.199691

SRM/«Unknown»
«5iHZX7VJQEXLiLZDGb1NgpVJoPiNhbG49UcZxSRd4cZt» Total Pool Token Supply: 10
«AGezWEZyRbnc5kXVkYXaQ2Mw9p96zKfB2QTKjNuhGWK8» [SRM ] Balance: 0.01
«GG2ZFbbUMPWBGsu6gDyMMs79CmHQ3RJsd3ysasfHKpzY» [«Unknown»] Balance: 0.0001

SRM/«Unknown»
«71BUm3dJgoC2T7xc8H5Ks3H28zs6SYDZFNVacYZYG7ak» Total Pool Token Supply: 10
«FWfK4zytK4w1mohyJwwSaHuMjXjP8CJupY5g2z5TCzDs» [SRM ] Balance: 0.01
«GP21Jtqagbt1qRc8FCXkVu9zG94ekTb5vdyQjcix6Dx3» [«Unknown»] Balance: 0.0001

SRM/«Unknown»
«F6eM7Ev75s4CLye7WGkAB36BS57yuobsr7pvf4a5MXWJ» Total Pool Token Supply: 0.00250013
«2hGA15ayh9KV1fzf9MtzaK4wQpTEetuonXfoSnePPVDW» [SRM ] Balance: 0.000013
«5DgXmSjdtdrocpUzy5KuuNqRptiKgVGxnZWdxc5J6zJM» [«Unknown»] Balance: 1e-8

YFI/USDC
«CHvaneMkSXZfaaaGZMM3ruZQq3inGoRsnixou9Q9syQA» Total Pool Token Supply: 97.50310531
«B9MEr7KGwk3CTJY4GXceNhAuFBWNM7H8sB3CehyA4xuN» [YFI ] Balance: 6.402354
«6GbReMURbDeMLxgszxZHGpCbuqo2rGi5aA7kPcJo8Gi4» [USDC ] Balance: 74865.921496

SRM/«Unknown»
«8taioaE2is8CP3mrYKBYdVUEphBJwHMejSFN5qEPEAEU» Total Pool Token Supply: 10
«3LpVGfWrdo5euNoYcvWSpkwaJeA6UvQ3kED8b8DRKiok» [SRM ] Balance: 0.01
«EJWMn2kPwviM27h9xj5ec7mC7z3q5nXmK9hUzeoMhKdL» [«Unknown»] Balance: 0.0001

SRM/«Unknown»
«12WxCZn2auqmNBjqJEJ7bNXNa3bo5Euo8MWnwGmThKgp» Total Pool Token Supply: 10
«37DcVXLY3kA8DhbCXqd45i454Sdk2xNt7NvPgdbDh6NF» [SRM ] Balance: 0.01
«9iGomE1dmTtc3McUTTjjA33Zv7rg2fa7pAVHSxyi5j6C» [«Unknown»] Balance: 0.0001

YFI/USDT
«39r7YcuxpZqqnFHcCiZJXvawwpKtpgmNpMiGrVGRyXfM» Total Pool Token Supply: 10.00044485
«9h4pFa6DRY739aFQTFx6nWAeuA2mU5vD2yfFPDaXSiLG» [YFI ] Balance: 7.664951
«9w5gUTSLhoxbDurc6NwwvacVr7tJoDUTZw1BSSY8MJTt» [USDT ] Balance: 89420.303842

SOL/«Unknown»
«D2pLz3BByUxYf2DswnCmHEfzMCLztKbhZxPJBkdzroZd» Total Pool Token Supply: 10
«6FS8X2n3mbha17Dmu24S2ub9nFxeuDeG8RAzkyaguDHr» [SOL ] Balance: 15
«Dbide56YVmmRdMJSzfjA1VCoFjgmiXh6BcjDUcQipCPL» [«Unknown»] Balance: 0.00025

FRONT/USDT
«EcbxwA89NXmvV3Po5t4radmtTAA8yvpcvXWMBMZ1uXhX» Total Pool Token Supply: 10.00029778
«8vzxKpYS82RQNc96gr8Pew9tSymnVWGbNV6KoBW1FnVF» [FRONT ] Balance: 328451.296768
«G3mdL6wmx26GXzpf8rYTdowk6faemqRW6eYLWBvWZfWr» [USDT ] Balance: 97614.116654

SRM/USDT
«2gJPRt8a9PNfjU4vFGtq4aH3ud1XY44tk9HvQVyF4eio» Total Pool Token Supply: 36.44822367
«8yrvkCJJTkLP4qhJXoeLysFxkTwPubNjCsEsXdaNGP9a» [SRM ] Balance: 359238.947811
«9wbVUfPPctfZCFwewVFmnzqVWtsk4abUSKeo99xzjL2b» [USDT ] Balance: 364985.889448

SRM/«Unknown»
«qvnuvx5h5oesykDksRB6Mee6cADTQfRYSJBGJhXgu2F » Total Pool Token Supply: 10
«BPnK3bvmWvwy2yCjQLVHhXbepvjgTatf22YUQNno4hA7» [SRM ] Balance: 0.01
«BU22istVhyB9R2HqNjGoazpLbLmLaVZa2wcZoY9shuB4» [«Unknown»] Balance: 0.0001

SRM/FTT
«AVqsLVPtzNDZyDi2aV5n6tXitQM1wYZu5NDfAHJ9gDwW» Total Pool Token Supply: 27.19360162
«5jYpJTdpLcHAnVti58bFsMiVEPAoboroAs5MwWJRnn3r» [SRM ] Balance: 278067.775197
«C5C2jDTKNywQ46mjU1WoSVy3CnPfh116ENe1x1YfoYG4» [FTT ] Balance: 70715.411586

SRM/«Unknown»
«FT15wBUtCngpfA1T4s7ApTigzRJ9SN33yA2VcrKhP2bY» Total Pool Token Supply: 10
«CHYyUmtfH9UCmvfLTU6TJeahwLmvn5UFFRe4upsPAAgi» [SRM ] Balance: 0.01
«5tjbs15ND4DqSCALrsV8uW34AswnBVtrWgMYragzJi2K» [«Unknown»] Balance: 0.0001

BTC/USDT
«2yCRA4Jfm88GAL19VAjb27V8mwhBgCr4D2aaNGHYcWnL» Total Pool Token Supply: 56212.18089591
«EwU3AQe2GVFARcbAnYQ9s87UprbEJ8FhigQiRNFysymB» [BTC ] Balance: 5.560369
«7EbKnBXxoWe7hAtz8gkx6dHtUbwDqUj4GFJDP58eXuYn» [USDT ] Balance: 74059.554235

FTT/USDT
«DYuUeHBYHY6F362m62whYzTg1SjMTEaNcugJydLt71kH» Total Pool Token Supply: 10.00065326
«4yrqm3TxE83CRtLXyovZzy2rgaQYgM2mmDer8ZM3AGtK» [FTT ] Balance: 25164.292183
«6qmdkXg6wi57zncThsHoUvWndgCBbL1zW7xMHMijSKe5» [USDT ] Balance: 98854.841821

BTC/USDC
«8SXu9YmNeoME4LW2USj6NQ47ZPYDrdz7Ki9JCVLc2D3g» Total Pool Token Supply: 56071.11492827
«4HyFLkX6SX4331VR6tNbzqphZiNBYwdPeJcVeKet6E3E» [BTC ] Balance: 5.536755
«7TgGoeagnBsswQo5wytvkEFW2nnUXzTKSj2q1LDJaNWQ» [USDC ] Balance: 73926.855013

FTT/USDC
«7UB1EcGcKaZDvrxTaU95nQ3yErVtyUMfX75V4FfxaSiJ» Total Pool Token Supply: 10.00046077
«D2DSex6FmzyvjFxZePLt7wSfwUXas8dhatJnPCNLdPZy» [FTT ] Balance: 25086.078061
«GniTz6gAQ9KX7E6YJ4gY9RZsWKGZzgRPY7yMHZokvMst» [USDC ] Balance: 98962.320674

UNI/SRM
«JAWWSHKSvypkPP9oSBJ4XpqNhCFJshjyiZTVEn94Yj2B» Total Pool Token Supply: 125.16297104
«2X7HkDNGasJchQup4omsvXj2JWii9txD74oJnRCEaLRA» [UNI ] Balance: 80.49194
«GJjqAxpbohfGJ6ww6baTW6Z75rPxpC1oJv7PvQMugiMt» [SRM ] Balance: 222.028524

SRM/«Unknown»
«GMqrWo9ixSCNhW7CzyRbbuaehRhCbpoULeGg8cmLXFKo» Total Pool Token Supply: 0
«3ASSeHgbQhSaKE2cukSJzmxSgesRyKCXCvZY5dmfEhvi» [SRM ] Balance: 0
«7zJQRWP8NzxNsg3RPWx9pvdkXqPojxWhN3b7f7meMY3X» [«Unknown»] Balance: 0

SRM/«Unknown»
«eJHLj4cphT3jgZbkwr8iBzwSNctLjfYt7w74Zs7sC1e » Total Pool Token Supply: 10
«DWH1jkBfMeCERYB7eEN4jovwYT6FBFF8j8AXUg9eBZUu» [SRM ] Balance: 0.01
«FvAQcUqg3R6nEEErEH2JpYcLYrgV7shbFJgYVtbnHwwz» [«Unknown»] Balance: 0.0001

ETH/USDT
«DefGE7phGrB4MvKYAp6LPZrSN7YHRDEJFE67UE6Wt1jG» Total Pool Token Supply: 10.00145228
«FHPvn9agBx3jKwjM7v8y6X3SzvwiSEJCVRJAEwfoH6X7» [ETH ] Balance: 249.873256
«HxpqChZS1Lbj7Tz9a9i4Z2X2zuT74etq61XtW7NBotbd» [USDT ] Balance: 97439.19187

SRM/«Unknown»
«7cyF31BLFYFr46guLTrkFpbcW21fpmrdzYBRLHYycECi» Total Pool Token Supply: 30.38017541
«HfNNRDi6sqDmxTe473C6v5GMfP5rGjdy8jXVEztR8afC» [SRM ] Balance: 89.778522
«D4LpktWyH3yZLw4Qmdo6qBW4ZrVCiCxcmMZSiZwb5CEs» [«Unknown»] Balance: 0.000944

LINK/USDT
«CeGr4m2pSDmWnp3V5xiqpGJ53b1q975tjmXHLejEsAhH» Total Pool Token Supply: 10.00034163
«9yu9j53H8kkyJvKbXhqFTWb8CyRY6zSKGFadRNF8ty7s» [LINK ] Balance: 8415.380063
«CzqrJHFEuumipSQHznLrgPVGqivWr2vF9rEkznsjXbXL» [USDT ] Balance: 98134.552709

SRM/FRONT
«ALNzhDhhB1VRuCk5ieofHqdk2wtLGjMfDjaP5t3LGCpv» Total Pool Token Supply: 10.88690287
«HkqYNBKup7EXXRmxNBQCaqdLJMxN5HQRXKyurRoQwyWa» [SRM ] Balance: 112440.128193
«EnK36DUFKpt6wBNemC7c6PpZb8MXvgKBNhrxy1tRD5af» [FRONT ] Balance: 378169.404141

SRM/SUSHI
«BrMQFZkL1ffHBsiURjmBTd4JDz4ddbTSVi7qfYCkYkNi» Total Pool Token Supply: 15.67603579
«6GkXtNTL8vn6drSysiyVg7RMptHvLjePfV9n6Xcisw4R» [SRM ] Balance: 159664.147627
«CS1bwaym3TT1KKAyMPRyMA8Gr7UfTBKVtm4vjmoEtbyy» [SUSHI ] Balance: 247123.848731

SRM/SOL
«tSiGXxfdHisArSPCf3zDRaQGGixYbeUojeNAVQmP1gg » Total Pool Token Supply: 26.70599252
«91G2AmdvD7ffpgq6FYj4qoSMYg9MF7t9FpqVUYv2aSCL» [SRM ] Balance: 259273.806586
«9MkmSbuZpxh2pvGWa3FjSaA7Kv2b99wrCJY4AdphpQ7o» [SOL ] Balance: 172166.224036944

SUSHI/USDT
«Av7UTnwMMHuzmANGykar4aYfbajRDcYs4rYV6HmQeEog» Total Pool Token Supply: 10.00121691
«3Y4iHxd7k3mmNSuFM1RKssZ4z4z8JYiYSp2nysrTkrHu» [SUSHI ] Balance: 144803.894776
«HKqPaH9XMouYf2NnmSSSLtU1Kx1GmJ1AMLWHDekuXdV4» [USDT ] Balance: 94198.988734

YFI/USDT
«3aFGuSFQcYbi4iVQJgR2W4C2Wfhwr7gBq5cYdCuAx9cQ» Total Pool Token Supply: 10.00009018
«9n5oY7QFF6PCq76p4u7thk2Lb9M2huYeQQZMRyRD57oZ» [YFI ] Balance: 7.27207
«96sZNoGRU2f2RrpjUPRkuRzpTxbCKvmiP9QCGMTDvnGq» [USDT ] Balance: 94209.82055

SRM/«Unknown»
«DMEbPnHYenmZJ9bGkQwsBXctbT6416xBdHQ1ZCgQS6ZL» Total Pool Token Supply: 10
«H3tJdnK6Jub3e96eo5xxrZd2VNFTX4iMWaEsScU2Ktip» [SRM ] Balance: 0.01
«A2XdccnDzkuHUdTiz44Zaa77vXU1QNHp3g6npHbqQv78» [«Unknown»] Balance: 0.0001

ETH/SOL
«4UXz9Wnhny7pEHnLyiSEtzK2qDxBM4Hkn4cMZUpbxzJu» Total Pool Token Supply: 10
«2giPtzzESTmVzjeNJsYMjJGDWsMsh5vwChVzCutdUY66» [ETH ] Balance: 0.000041
«5R41hyVu9yCa7Ce3Pq5GKFNjQQU1iazaGHtmHifki9My» [SOL ] Balance: 0.003

USDC/USDT
«8geAdxAKuSWJzAnUAUofuo5LBdqrCbBo7jzS1yb53qHL» Total Pool Token Supply: 10.00199756
«FVN4QvcPyxYtEcnGQ46fqNdGCbis4opzjkpNE1N7UBsp» [USDC ] Balance: 29959.804439
«8LkNu3gWQ4HdTg9qyMw4WsXZbHABQR22Xgn46QHx6wJ8» [USDT ] Balance: 30106.506702

SRM/«Unknown»
«9q1DLmrGKzSyNrbpdrg2GhT7vhAocggpsoFD7ZkbP92T» Total Pool Token Supply: 10
«8dYnXVHTnBqmfViND456FCQqdQoAqGoNsBZb3HKnkUTg» [SRM ] Balance: 0.01
«G1XQzcN8rtvkiat36QDFQ55PcsApYQHUZDjxNAxFRUTu» [«Unknown»] Balance: 0.0001

SRM/YFI
«6P5wDE2KjzTPu9RE2jZKWLxviqfMkVcnMBv6tQFaf4oB» Total Pool Token Supply: 18.59523468
«5xKLdnpCFxbDVN1K6FyUY74k2DeFDRP9i6Ko11wRbSPK» [SRM ] Balance: 176599.397807
«8hzpnXj2nVVvNo9zSNqDB3oRAYXodHxftMuQfJPjcbFU» [YFI ] Balance: 15.289859

LINK/ETH
«9eFYDob2bBP7ACBR2PHwawdYjG25MwtVPaL5QjstbMSt» Total Pool Token Supply: 10
«2tgrjLv3oLyUrHf9mUVfEgcvS87obLVyrvpYreu6FgPw» [LINK ] Balance: 0.1
«WicUeUmWwkBd7QzPTdSYv7aPT2EPSq3iJEi2qNAsP3w » [ETH ] Balance: 0.1

SRM/«Unknown»
«DaX8iTrkeFokeKVEDrQSbASCkzrbct1zfxzC5RWD5kD5» Total Pool Token Supply: 10
«FY8uoCQV1nzgaeGYYdY2XsZKe5tU3xDC7ntbb5zgU14Q» [SRM ] Balance: 0.01
«4mKiJNQeSaKCKHpf3j1DsZoAuXH3vRVkEUnygkBJ1C62» [«Unknown»] Balance: 0.0001

SRM/ETH
«CibFicoaEmw6CLocb1iDA9Vo6uMDwt75P1rAvUky2dq6» Total Pool Token Supply: 30.56930162
«6qFBMpkkUmvWnTezwTL3ni2UJHi9xaVbtr97kb8LkMx9» [SRM ] Balance: 308054.529929
«s6PZygqBbiqmRxJgg4DyDBg1pb5owiDPLCXtV3c3Sgc » [ETH ] Balance: 794.994354

«Unknown»/USDT
«DRsPiTSLRvRRv3KYyttrC413idYkRN9ygiouVDkCQsWp» Total Pool Token Supply: 33.12749447
«8UBQ6e5Q11LkgtM3VtMb7eRSo5WLuEqgcrtequMCFia1» [«Unknown»] Balance: 0.003797
«2BCUn6nwej6Hc8rfdox6EqKgVqA3psEzin5SBtdgTsSz» [USDT ] Balance: 117.869921

FRONT/USDC
«HqbAFQLKGpFNVPYzUCQvfytqVBoDmsK9UJNW28eZ6bvb» Total Pool Token Supply: 10.00012258
«8sgDkgKvoAMYef1TtyWRdTJWovbvNX6mXPFqvT7s5Yoj» [FRONT ] Balance: 336592.9478
«57jkMQGDbBWsjUR7ZRAYfqiW9wMc1HGrZ2vFDiQ1e6UB» [USDC ] Balance: 95164.882076

SRM/BTC
«CWuypwJdDi8pxNZ1k4HMUVzk8rtkrBnzqfnmc6y1pci3» Total Pool Token Supply: 27.99751075
«52sRWB9WF4TguC5brbJPPnmwL5tr3HwfcMw6BL7hPScr» [SRM ] Balance: 288718.534976
«HgWgW4aiN5AVMJeQ3EivdUk1FR2DYbd6GSxnMni1ECFQ» [BTC ] Balance: 21.733127

SOL/ETH
«HNrsjrtw4xGGb5KcXPBTzZYjuB1WKAhDDGUg8kRMQZA1» Total Pool Token Supply: 0
«H2Y7uY4WWYx1L43ULvHBG5H1fQa3mcLqWxsycvXSsjZ5» [SOL ] Balance: 0
«Hhrtg7uMhXECDRSWjHMjee6mtGb97aTG9c51cHkqbhDE» [ETH ] Balance: 0

ETH/USDC
«52qB7roEPu9JFd2S9YG38iYwKKLZCRAZUHrDkkTzehiN» Total Pool Token Supply: 10.00041963
«BFhG6mNYQY4zRPXQYJGLjiD61wtbgMxLgFBBS5sXtvKE» [ETH ] Balance: 253.186418
«4MiqtYeZauGjTVwZy8F7qtFU5x4emV6kT9PA8SJzXrDL» [USDC ] Balance: 98001.017065

SUSHI/USDC
«BXHZf5RXGMEkP5EcbRbkg6LMikbSbRocjtGag97SjZo5» Total Pool Token Supply: 10.00037634
«8iQg2QkhjPQ1qSWsFZzHkBRA61VbjZ68DdW3nXRATXke» [SUSHI ] Balance: 149350.009187
«7Ne4Unp2CWyJBLjsGai5XJsDX61A5RpHAbPfrzffSkiS» [USDC ] Balance: 98520.66279

«Unknown»/«Unknown»
«7WseRxa7UVLUQei9fmmtC4xdC3vT7zNg4ezcz6AfFvHK» Total Pool Token Supply: 10
«21uus8X79UjKRYMi9mDDVyyQHzPs21dV6EFTA3MNUgrb» [«Unknown»] Balance: 0.00001
«GwTr3TJwogWdJkqimC6opP1beUQxrzC41XNQM8YTq7Gs» [«Unknown»] Balance: 0.0001

SRM/«Unknown»
«FWms6LNabrYp7XYCzCw4ZDXxtoPBwDQCaStikH9nTPdq» Total Pool Token Supply: 10
«FKZCvc7YfE36yVygypHbyF6VxARinmz2hHo8UU9C39eY» [SRM ] Balance: 0.01
«EN5RKFFJR38jau74bjCgpPSotkSAqLzsq95DGbWdRPhL» [«Unknown»] Balance: 0.0001

«Unknown»/LINK
«GWYuvizfKPt7Wu9yUQ674ghPKEBYoSbHxjcSHqQyZ7s5» Total Pool Token Supply: 10.0018619
«6yHYMXNTE4asUq9Pcs13WT5AMFRZ6cs45TkVftw4Bezt» [«Unknown»] Balance: 0.000162
«7qcve8b3Fbo9vkL8tf28ZXRZsy9GgKjpfPpHHT6UiURR» [LINK ] Balance: 4.172998

SRM/«Unknown»
«Dm6P1jkqvk7TQ1jZQC9jE2DFHVEWZ4HwQKFxe26jNjdL» Total Pool Token Supply: 10
«CteTbnBEHsaR82Px1ftewEMWVfPHjTbB2ucoTrdbST6c» [SRM ] Balance: 0.01
«7TC7xATjxn3N614Fjcsjwe7gBVgAg6yjHs14uDgUhuse» [«Unknown»] Balance: 0.0001

SOL/USDT
«H2mJpdQTBcsfGUJvVJjRpPd95RKf2stDadJnR3Mf2qq7» Total Pool Token Supply: 10.01901305
«BonNXQQvno7FeKkhzZnb9QJAJVNgve51yktA17Auww8f» [SOL ] Balance: 62713.766705187
«4b4GFnMRmjR961me733WnHCvD18DiB9vifzdNf9CXekq» [USDT ] Balance: 94600.502589

SOL/WUSDC
«HepGD6DPahG4vJnLwwYFpp8KajfJBknQyg95bJbjnoft» Total Pool Token Supply: 0.93873765
«5J5CuFt9btpK1MRZoSVYyTyx5EYQL5nM4y1SV9X7FLrD» [SOL ] Balance: 7.049442725
«7jn4cVt8vyfTuuy6q7GU4ubDPjteArPqh4bXzRQugh9r» [WUSDC ] Balance: 3.797033

I hope this saves someone some time.

Tags: Crypto
Created by on Logo15659OpinionatedGeek Ltd.Logo15659

‘I Miss The Culture’

Score: 4/5

It’s not that there’s anything wrong with this book - it’s a good book - but sentient spaceships with consciousness and their own motivations always makes me miss The Culture novels from Iain M. Banks.

This book is fun, but it’s not a Culture novel - and that’s not the author’s fault.

Tags: 4 Word Book Reviews
Created by on Logo15659OpinionatedGeek Ltd.Logo15659

‘You’re Doing It Wrong’

Score: 4/5

I love the books these days that delve into the everyday things we thought we knew, bringing in the latest science and investigations, and showing that what we thought we knew may not be true.

This book is very much in that vein. Given how much all of us breathe it’s surprising the differences between ‘accepted wisdom’ and new research results. It’ll be interesting to see what comes of some of the research mentioned here...

Tags: 4 Word Book Reviews
Created by on Logo15659OpinionatedGeek Ltd.Logo15659

‘Spotting Mega Historical Shifts’

Score: 4/5

Hmm. Lots to think about in this book.

It was written over two decades ago, trying to forecast where things would be or at least the direction in which they were heading. It got some things wrong but it got lots right too. The talk of cryptographic payments and identities seems quite prophetic.

We have seen a weakening of the nation state, but I felt it was in more danger in the late 90s when this book was written than now. Although some individual states do seem in decline, others seem to be rising to prominence to take their place. Maybe devolution, federalism and subsidiarity will take over but the last couple of years has seen centralisation come to the fore again. But history doesn’t move in a straight line.

There’s plenty to disagree with too. Not just the things it missed or the things it got wrong, some of the attitude seems to miss the mark too, particularly when it comes to morality. But maybe that’s just me.

Tags: 4 Word Book Reviews
Created by on Logo15659OpinionatedGeek Ltd.Logo15659

‘More Unlikely Infantry Action’

Score: 4/5

Another cheap book. More poor copy editing, small margins, and - surprisingly - a table of contents that just lists ‘Chapter One... Chapter Two... Chapter Three...’ and so on, with no page numbers. It’s just as well there are no page numbers in the table of contents because none of the pages have page numbers either.

I still don’t think space battles will have infantry. I still think the premise of these books is silly. I still enjoyed it.

Tags: 4 Word Book Reviews
Created by on Logo15659OpinionatedGeek Ltd.Logo15659

‘Really Just Didn’t Care’

Score: 2/5

Another Laundry Files book. The author again shifted perspective/voice for this book, going to a different character. I didn’t like this character in previous books, I didn’t like her in this book. I don’t think we’re supposed to like her.

Going through a whole book of this was quite a chore. The sections that weren’t from the perspective of the main character were often voiced by another dislikable character.

Mostly, while I wanted the good guys to win I pretty much didn’t care if all the characters in this book died horribly.

I think I’ll be more careful in deciding whether to read future Laundry novels.

Tags: 4 Word Book Reviews
Created by on Logo15659OpinionatedGeek Ltd.Logo15659

‘Alien Battles Are Infantry-less’

Score: 4/5

Battles between aliens will not be infantry battles.

They just won’t. Except in this book.

It’s amazing the contortions the author has to go through to give infantry battles any credibility in this book. ‘Rules’ from ancient civilisations preventing use of certain technologies in wars - ‘certain technologies’ being just about anything that isn’t effectively infantry battles and World War 2 naval combat between spaceships.

But if you can put that aside, it’s a nice, silly, readable sci-fi romp.

The actual quality of the book isn’t that great though. The cover is flimsy, the layout is bade, the text is printed too close to both margins, and the text could do with another editing pass.

That aside, the book is cheaper than average so maybe this cost-cutting took a couple of quid off the price? ‘Never mind the quality, feel the width’...

Tags: 4 Word Book Reviews
Created by on Logo15659OpinionatedGeek Ltd.Logo15659