‘Readable Southern Crime Drama’
Score: 4/5
This was fun to read. It’s a well-paced thriller with a lot of action. Nice.
Created by on
Score: 4/5
This was fun to read. It’s a well-paced thriller with a lot of action. Nice.
Score: 3/5
There’s a lot of sports stuff in this book. Maybe I’m supposed to know that already - maybe I’m supposed to recognise the names of the authors? I didn’t, so I ended up with productivity coaching that uses a lot of sports stories.
That might otherwise be fine, but these stories are so brief they’re cut off. Like ‘Person A developed this into his routine for Team B in 1986’ with the implied you-know-how-they-did-in-1987. But I don’t know. I don’t even know what sport Team B played. I’m assuming what Person A did was useful to the team, but when so many stories are cut off like this I feel like I’m not getting a lot of benefit from the half of the book I can understand.
Score: 2/5
This is not a good book. That’s such a shame because I really wanted to like it. I’d seen some of the TV series and what I saw was OK. That made the disappointment in this book harder.
Maybe I was misled by David Jason playing an affable man-of-the-people kind of detective. The D.I. Frost of this book isn’t a wisecracking copper with a heart of gold so much as a cheeky gobshite. He says the sort of things he finds funny but others don’t. The kind of thing people get punched for.
Which is all fair enough. There are indeed people like that.
What really wound me up though was the swearing.
It’s bad.
It’s really bad.
It’s not that it’s stuff that would make a sailor blush. It’s the opposite. It’s that all these hard-bitten peelers say such tame things. It’s suspension-of-disbelief-breaking bad.
For example, from page 115, here’s Frost getting some bad news:
Frost shook his head. ‘It’s too flaming late. He’ll be miles away by now.’ He buried his face in his hands. ‘It’s not my bleeding night.’
It’s all so ridiculously PG-13 for a multiple-murder inquiry.
I get that some people don’t like swearing. If that’s you, then you may have found a nice series of detective novels for yourself.
If, on the other hand, you’ve ever met one of the boys in blue, you might find it all a bit too unrealistic.
Score: 5/5
The main thing I learned from this book: it’s all very complicated.
It’s incredible how complicated genetics is, and how little we still know about it all. Your genes are not your destiny, but your genes do seem to be involved in many, many processes, some of which we previously didn’t think had any gene involvement.
We’re at the stage where we can see some genes having some involvement in appetite, weight, fat stores etc. And we can sometimes see the direction, and sometimes even the rough extent, of the impact a particular gene has. But that still gives such an incomplete picture.
We’re only getting better at that kind of thing though, which may be wonderful, or may be a bit terrifying. Or both.
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.
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?
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.
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.
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.
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...