PathrockNetwork Gno Explorer
HomeBlocksTransactionsTokensRealmsPackagesValidatorsAnalytics

PathrockNetwork Gno Explorer — an independent explorer for Gno.land Mainnet (gnoland-1), operated by PathrockNetwork. Not an official Gno.land service.

gnowebarchive RPC

Transaction

successcanonically verified

Overview

Hash
7FA3FBE10E5AB77E3246F9D5…64D0AA7C8F7C98D1
Block
406,149 (index 0)
Time
2026-09-28 18:46:59 UTC
Signers
g1manfred4…cedlf5
Fee
85,705 ugnot
Gas wanted / used
8,570,500 / 6,109,139 (71%)
Memo
—
Canonical block
52C1A6302C88…AAC1C958

Messages (1)

#0 vm/execgno.land/r/moul/blog.Set(gnopm, sharing gnopm, 2026-09-28, gnopm,tooling,packages, gnopm is a package manager I wrote because bumping a version in gno destroyed the diff. It keeps a package's version in its `gnomod.toml` instead of in its directory name, and everything else it does falls out of that. ## the diff that started it A gno import path ends in its version, so the obvious layout gives each version its own directory, and a bump means copying that directory. **git cannot pair a copy.** The review diff becomes added files with no content diff at all, which is backwards: a bump is by definition the compatibility change that most needs reviewing, and it is the one change you cannot see. `log --follow`, `blame` and `bisect` stop there too. One port of 25 realms landed in my repo as **+11,103 / -0 across 112 files**, every behaviour change invisible. The toolchain already reads the version from the module line, so the directory does not have to repeat it: ``` p/alice/md/gnomod.toml module = "gno.land/p/alice/md/v1" p/alice/md/md.gno edited in place ``` A bump is one line, then the real diff. The superseded version gets pinned in a `gnomod.lock` to the commit that still holds it and rebuilt on demand, so anything importing `.../md/v0` keeps resolving with no directory left. That lock is source, not a build artefact. A change that bumps a version carries the pin keeping the old one resolvable, so it is the author who commits it and CI that proves it still reproduces. ## a version number is a tag, not a counter This one cost me before I understood it. A number means nothing until the version is published: until then it names no bytes and derives no address. So you bump when the last version shipped, and edit in place when it did not. Getting it wrong is the *default* behaviour of a stack of pull requests. The first bumps v0 to v1 and lands. The second is written against it, sees v1 taken, goes to v2. Both merge before either is published, and the package reaches a chain as v2 with v1 existing nowhere. I did it to four packages in a single stacked pair of pull requests, and the lock could not show me: a skipped number is never recorded, so it jumps v0 to v2 with nothing in between. `gnopm tidy` asks the chain, which is the only thing that knows, and names the `unbump` that folds it back. That was an 8-line diff of module lines once I could see it. ## 325 packages My own repo was never the real test. `examples/` in the gno monorepo is: thousands of files, many versions, a layout nobody designed with this in mind. Ran it on 2026-09-28 against master, in a throwaway worktree. 325 packages, 97 lifted out of versioned directories, **987 renames and zero content changes in 19.9 seconds**. `gnopm verify` over the result: 0.08s, all 325 ok. `gno lint` and `gno test` pass on the migrated packages, using gno's own binary. One package blocked it, correctly: a quarantined realm that exists both unversioned and under `v1/` and `v2/`, so lifting v2 has nowhere to land and nothing can say which is current. I have not opened that as a pull request and would not from a script. It is 994 files in somebody else's repo, and which layout a project wants is a maintainer's call. The rehearsal just means that conversation can start with measurements instead of a claim. ## please break it [moul/gnopm](https://github.com/moul/gnopm). One Go binary, no third-party dependencies, no gno toolchain needed to build it. ```sh go install moul.io/gnopm@latest gnopm init ``` If you arrive from npm and type `gnopm install`, it tells you why there is nothing to install rather than "unknown command". There is no resolver and never will be: an import path carries its version, so two versions are two paths and there is no constraint to solve. gno skipped the entire class of problem that produces SAT solvers, by accident of path design, and I am not reintroducing it. What I want is an issue when it surprises you, and that counts when it behaved exactly as documented. Most of what is in there started as somebody, usually me, saying "I expected it to just do that".)

Events (1)

StorageDepositEventgno.land/r/moul/blog
+9,341 bytes · 934,100 ugnot

Response

Log
msg:0,success:true,log:,events:[]
Data (return value)


Raw data

Raw transaction payload (content_raw from tx-indexer)
Tx{0AE0200A0A2F766D2E6D5F63616C6C12D1200A2867316D616E6672656434376B7A647565633932307A38387766723634796C6B736D646365646C66352214676E6F2E6C616E642F722F6D6F756C2F626C6F672A035365743205676E6F706D320D73686172696E6720676E6F706D320A323032362D30392D32383216676E6F706D2C746F6F6C696E672C7061636B6167657332CF1F676E6F706D2069732061207061636B616765206D616E6167657220492077726F746520626563617573652062756D70696E6720612076657273696F6E20696E20676E6F2064657374726F7965640A74686520646966662E204974206B656570732061207061636B61676527732076657273696F6E20696E206974732060676E6F6D6F642E746F6D6C6020696E7374656164206F6620696E206974730A6469726563746F7279206E616D652C20616E642065766572797468696E6720656C736520697420646F65732066616C6C73206F7574206F6620746861742E0A0A2323207468652064696666207468617420737461727465642069740A0A4120676E6F20696D706F7274207061746820656E647320696E206974732076657273696F6E2C20736F20746865206F6276696F7573206C61796F757420676976657320656163682076657273696F6E0A697473206F776E206469726563746F72792C20616E6420612062756D70206D65616E7320636F7079696E672074686174206469726563746F72792E0A0A2A2A6769742063616E6E6F742070616972206120636F70792E2A2A20546865207265766965772064696666206265636F6D65732061646465642066696C65732077697468206E6F20636F6E74656E740A6469666620617420616C6C2C207768696368206973206261636B77617264733A20612062756D7020697320627920646566696E6974696F6E2074686520636F6D7061746962696C6974790A6368616E67652074686174206D6F7374206E6565647320726576696577696E672C20616E6420697420697320746865206F6E65206368616E676520796F752063616E6E6F74207365652E0A606C6F67202D2D666F6C6C6F77602C2060626C616D656020616E642060626973656374602073746F7020746865726520746F6F2E0A0A4F6E6520706F7274206F66203235207265616C6D73206C616E64656420696E206D79207265706F206173202A2A2B31312C313033202F202D30206163726F7373203131322066696C65732A2A2C0A6576657279206265686176696F7572206368616E676520696E76697369626C652E0A0A54686520746F6F6C636861696E20616C7265616479207265616473207468652076657273696F6E2066726F6D20746865206D6F64756C65206C696E652C20736F20746865206469726563746F72790A646F6573206E6F74206861766520746F207265706561742069743A0A0A6060600A702F616C6963652F6D642F676E6F6D6F642E746F6D6C20202020206D6F64756C65203D2022676E6F2E6C616E642F702F616C6963652F6D642F7631220A702F616C6963652F6D642F6D642E676E6F2020202020202020202065646974656420696E20706C6163650A6060600A0A412062756D70206973206F6E65206C696E652C207468656E20746865207265616C20646966662E2054686520737570657273656465642076657273696F6E20676574732070696E6E656420696E20610A60676E6F6D6F642E6C6F636B6020746F2074686520636F6D6D69742074686174207374696C6C20686F6C647320697420616E642072656275696C74206F6E2064656D616E642C20736F0A616E797468696E6720696D706F7274696E6720602E2E2E2F6D642F763060206B65657073207265736F6C76696E672077697468206E6F206469726563746F7279206C6566742E0A0A54686174206C6F636B20697320736F757263652C206E6F742061206275696C642061727465666163742E2041206368616E676520746861742062756D707320612076657273696F6E20636172726965730A7468652070696E206B656570696E6720746865206F6C64206F6E65207265736F6C7661626C652C20736F2069742069732074686520617574686F722077686F20636F6D6D69747320697420616E640A434920746861742070726F766573206974207374696C6C20726570726F64756365732E0A0A232320612076657273696F6E206E756D6265722069732061207461672C206E6F74206120636F756E7465720A0A54686973206F6E6520636F7374206D65206265666F7265204920756E64657273746F6F642069742E2041206E756D626572206D65616E73206E6F7468696E6720756E74696C207468650A76657273696F6E206973207075626C69736865643A20756E74696C207468656E206974206E616D6573206E6F20627974657320616E642064657269766573206E6F20616464726573732E20536F0A796F752062756D70207768656E20746865206C6173742076657273696F6E20736869707065642C20616E64206564697420696E20706C616365207768656E20697420646964206E6F742E0A0A47657474696E672069742077726F6E6720697320746865202A64656661756C742A206265686176696F7572206F66206120737461636B206F662070756C6C2072657175657374732E205468650A66697273742062756D707320763020746F20763120616E64206C616E64732E20546865207365636F6E64206973207772697474656E20616761696E73742069742C20736565732076312074616B656E2C0A676F657320746F2076322E20426F7468206D65726765206265666F726520656974686572206973207075626C69736865642C20616E6420746865207061636B616765207265616368657320610A636861696E2061732076322077697468207631206578697374696E67206E6F77686572652E0A0A492064696420697420746F20666F7572207061636B6167657320696E20612073696E676C6520737461636B65642070616972206F662070756C6C2072657175657374732C20616E64207468650A6C6F636B20636F756C64206E6F742073686F77206D653A206120736B6970706564206E756D626572206973206E65766572207265636F726465642C20736F206974206A756D707320763020746F2076320A77697468206E6F7468696E6720696E206265747765656E2E2060676E6F706D2074696479602061736B732074686520636861696E2C20776869636820697320746865206F6E6C79207468696E670A74686174206B6E6F77732C20616E64206E616D6573207468652060756E62756D7060207468617420666F6C6473206974206261636B2E20546861742077617320616E20382D6C696E6520646966660A6F66206D6F64756C65206C696E6573206F6E6365204920636F756C64207365652069742E0A0A232320333235207061636B616765730A0A4D79206F776E207265706F20776173206E6576657220746865207265616C20746573742E20606578616D706C65732F6020696E2074686520676E6F206D6F6E6F7265706F2069733A0A74686F7573616E6473206F662066696C65732C206D616E792076657273696F6E732C2061206C61796F7574206E6F626F64792064657369676E65642077697468207468697320696E206D696E642E0A0A52616E206974206F6E20323032362D30392D323820616761696E7374206D61737465722C20696E2061207468726F776177617920776F726B747265652E20333235207061636B616765732C2039370A6C6966746564206F7574206F662076657273696F6E6564206469726563746F726965732C202A2A3938372072656E616D657320616E64207A65726F20636F6E74656E74206368616E67657320696E0A31392E39207365636F6E64732A2A2E2060676E6F706D2076657269667960206F7665722074686520726573756C743A20302E3038732C20616C6C20333235206F6B2E2060676E6F206C696E74600A616E642060676E6F2074657374602070617373206F6E20746865206D69677261746564207061636B616765732C207573696E6720676E6F2773206F776E2062696E6172792E0A0A4F6E65207061636B61676520626C6F636B65642069742C20636F72726563746C793A20612071756172616E74696E6564207265616C6D20746861742065786973747320626F74680A756E76657273696F6E656420616E6420756E646572206076312F6020616E64206076322F602C20736F206C696674696E6720763220686173206E6F776865726520746F206C616E6420616E640A6E6F7468696E672063616E207361792077686963682069732063757272656E742E0A0A492068617665206E6F74206F70656E6564207468617420617320612070756C6C207265717565737420616E6420776F756C64206E6F742066726F6D2061207363726970742E204974206973203939340A66696C657320696E20736F6D65626F647920656C73652773207265706F2C20616E64207768696368206C61796F757420612070726F6A6563742077616E747320697320610A6D61696E7461696E657227732063616C6C2E205468652072656865617273616C206A757374206D65616E73207468617420636F6E766572736174696F6E2063616E20737461727420776974680A6D6561737572656D656E747320696E7374656164206F66206120636C61696D2E0A0A232320706C6561736520627265616B2069740A0A5B6D6F756C2F676E6F706D5D2868747470733A2F2F6769746875622E636F6D2F6D6F756C2F676E6F706D292E204F6E6520476F2062696E6172792C206E6F2074686972642D70617274790A646570656E64656E636965732C206E6F20676E6F20746F6F6C636861696E206E656564656420746F206275696C642069742E0A0A60606073680A676F20696E7374616C6C206D6F756C2E696F2F676E6F706D406C61746573740A676E6F706D20696E69740A6060600A0A496620796F75206172726976652066726F6D206E706D20616E6420747970652060676E6F706D20696E7374616C6C602C2069742074656C6C7320796F75207768792074686572652069730A6E6F7468696E6720746F20696E7374616C6C20726174686572207468616E2022756E6B6E6F776E20636F6D6D616E64222E205468657265206973206E6F207265736F6C76657220616E64206E657665720A77696C6C2062653A20616E20696D706F727420706174682063617272696573206974732076657273696F6E2C20736F2074776F2076657273696F6E73206172652074776F20706174687320616E640A7468657265206973206E6F20636F6E73747261696E7420746F20736F6C76652E20676E6F20736B69707065642074686520656E7469726520636C617373206F662070726F626C656D20746861740A70726F64756365732053415420736F6C766572732C206279206163636964656E74206F6620706174682064657369676E2C20616E64204920616D206E6F74207265696E74726F647563696E672069742E0A0A5768617420492077616E7420697320616E206973737565207768656E2069742073757270726973657320796F752C20616E64207468617420636F756E7473207768656E20697420626568617665640A65786163746C7920617320646F63756D656E7465642E204D6F7374206F66207768617420697320696E207468657265207374617274656420617320736F6D65626F64792C20757375616C6C79206D652C0A736179696E6720224920657870656374656420697420746F206A75737420646F2074686174222E121108889A9608120A383537303575676E6F741A7E0A3A0A132F746D2E5075624B6579536563703235366B3112230A210200524A3F8D2C003A89C43F45FEAF6EB8ED45B6E3A35F7BBE6B3B49FF9E2D83C81240F5DAF0003036810720F765A7D63C478AC0F5332FBEF72C8C53C3993BF82C0E9D14E288581B45DB056B4CA349B1750510CC6F105D589D0DE735290B7270F56248}
{
  "__typename": "MsgCall",
  "caller": "g1manfred47kzduec920z88wfr64ylksmdcedlf5",
  "send": "",
  "pkg_path": "gno.land/r/moul/blog",
  "func": "Set",
  "args": [
    "gnopm",
    "sharing gnopm",
    "2026-09-28",
    "gnopm,tooling,packages",
    "gnopm is a package manager I wrote because bumping a version in gno destroyed\nthe diff. It keeps a package's version in its `gnomod.toml` instead of in its\ndirectory name, and everything else it does falls out of that.\n\n## the diff that started it\n\nA gno import path ends in its version, so the obvious layout gives each version\nits own directory, and a bump means copying that directory.\n\n**git cannot pair a copy.** The review diff becomes added files with no content\ndiff at all, which is backwards: a bump is by definition the compatibility\nchange that most needs reviewing, and it is the one change you cannot see.\n`log --follow`, `blame` and `bisect` stop there too.\n\nOne port of 25 realms landed in my repo as **+11,103 / -0 across 112 files**,\nevery behaviour change invisible.\n\nThe toolchain already reads the version from the module line, so the directory\ndoes not have to repeat it:\n\n```\np/alice/md/gnomod.toml     module = \"gno.land/p/alice/md/v1\"\np/alice/md/md.gno          edited in place\n```\n\nA bump is one line, then the real diff. The superseded version gets pinned in a\n`gnomod.lock` to the commit that still holds it and rebuilt on demand, so\nanything importing `.../md/v0` keeps resolving with no directory left.\n\nThat lock is source, not a build artefact. A change that bumps a version carries\nthe pin keeping the old one resolvable, so it is the author who commits it and\nCI that proves it still reproduces.\n\n## a version number is a tag, not a counter\n\nThis one cost me before I understood it. A number means nothing until the\nversion is published: until then it names no bytes and derives no address. So\nyou bump when the last version shipped, and edit in place when it did not.\n\nGetting it wrong is the *default* behaviour of a stack of pull requests. The\nfirst bumps v0 to v1 and lands. The second is written against it, sees v1 taken,\ngoes to v2. Both merge before either is published, and the package reaches a\nchain as v2 with v1 existing nowhere.\n\nI did it to four packages in a single stacked pair of pull requests, and the\nlock could not show me: a skipped number is never recorded, so it jumps v0 to v2\nwith nothing in between. `gnopm tidy` asks the chain, which is the only thing\nthat knows, and names the `unbump` that folds it back. That was an 8-line diff\nof module lines once I could see it.\n\n## 325 packages\n\nMy own repo was never the real test. `examples/` in the gno monorepo is:\nthousands of files, many versions, a layout nobody designed with this in mind.\n\nRan it on 2026-09-28 against master, in a throwaway worktree. 325 packages, 97\nlifted out of versioned directories, **987 renames and zero content changes in\n19.9 seconds**. `gnopm verify` over the result: 0.08s, all 325 ok. `gno lint`\nand `gno test` pass on the migrated packages, using gno's own binary.\n\nOne package blocked it, correctly: a quarantined realm that exists both\nunversioned and under `v1/` and `v2/`, so lifting v2 has nowhere to land and\nnothing can say which is current.\n\nI have not opened that as a pull request and would not from a script. It is 994\nfiles in somebody else's repo, and which layout a project wants is a\nmaintainer's call. The rehearsal just means that conversation can start with\nmeasurements instead of a claim.\n\n## please break it\n\n[moul/gnopm](https://github.com/moul/gnopm). One Go binary, no third-party\ndependencies, no gno toolchain needed to build it.\n\n```sh\ngo install moul.io/gnopm@latest\ngnopm init\n```\n\nIf you arrive from npm and type `gnopm install`, it tells you why there is\nnothing to install rather than \"unknown command\". There is no resolver and never\nwill be: an import path carries its version, so two versions are two paths and\nthere is no constraint to solve. gno skipped the entire class of problem that\nproduces SAT solvers, by accident of path design, and I am not reintroducing it.\n\nWhat I want is an issue when it surprises you, and that counts when it behaved\nexactly as documented. Most of what is in there started as somebody, usually me,\nsaying \"I expected it to just do that\"."
  ],
  "max_deposit": ""
}