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
D275522CDC327E75D9F7472E…99D8142DC64DA812
Block
408,742 (index 0)
Time
2026-09-28 21:09:57 UTC
Signers
g1manfred4…cedlf5
Fee
200,510 ugnot
Gas wanted / used
20,051,000 / 10,182,238 (51%)
Memo
—
Canonical block
708DEF997845…A5617EB1

Messages (2)

#0 vm/execgno.land/r/moul/blog.Set(from-maketx-run-to-templated-contracts, your run script is a shell script, compile it, 2026-09-16, msgrun,msgcall,gas,contracts, You write a little `.gno` file, you run it, it does exactly what you wanted. ```sh gnokey maketx run -broadcast -chainid pearl-1 mykey script.gno ``` Then you point the same command at mainnet and it stops. Not a compile error, not a panic: the transaction never gets to run at all. The gate is `vm.run_submitters`, an allowlist of addresses permitted to send `MsgRun`. Empty means off, list one address and it is on, and mainnet has it on. ## why it is gated, which tells you what to do about it `MsgRun` type-checks and executes arbitrary source immediately, and it is the only code-bearing message with no other gate: `MsgAddPackage` clears a namespace check and a CLA check, while `MsgRun`'s path is forced to `/e/<caller>/run` and has no namespace to check against. `MsgAddPackage` publishes code someone can look at, under a name someone owns. `MsgRun` publishes code that executes once and leaves no reviewable artifact. On a chain that wants a review surface, only one of those stays open. ## a run script is a shell script, structurally You hand the chain source, it compiles, runs `main()`, throws the binary away. Nothing persists, nothing is named, nothing can be called again. That is `sh script.sh` with a blockchain for a kernel, and two properties follow. **A run script carries things a call cannot.** `MsgCall` marshals arguments from strings and accepts primitives, byte arrays and byte slices; everything else hits `panic("unexpected type in contract arg")`. A script has no such limit because it does not marshal the argument, it writes the code that builds it. That is why GovDAO proposals are `MsgRun`-only. **A run script runs as you.** The ephemeral path is `gno.land/e/<your-address>/run` and address derivation special-cases it, so inside a run script "the calling realm" *is* you. Any API resolving an actor from its caller acts on your own account. From a deployed realm the same call acts as that realm. This is the property people build on without noticing, and the one that does not survive the migration. ## so the migration is not a workaround, it is compiling A run script is a shell script; a realm is the binary you ship once the script stops changing. Move the logic on chain once and what crosses the wire afterwards is primitives again, which is all `MsgCall` ever needed. Every script I have looked at falls in one of three piles. **It only needs a func value or a struct.** A wrapper realm supplies the closure, the user passes strings. Most projects did this already without framing it that way: a router realm *is* this fix. **It needs to act as the signer.** This is the pile that bites, and I tried to build the wrong fix for it first, a generic hub that moves an allowance on anyone's behalf. It cannot exist, on purpose: `ImpersonateTeller` is on the private ledger, so a helper realm acts only as itself and a hub acting as its caller is a confused deputy. The fix is the owning realm exposing the entry point, which for a token is the standard wrapper set: ```go var userTeller = ledger.CallerTeller() // actor = whoever crossed in = the signer func Approve(cur realm, spender address, amount int64) { checkErr(userTeller.Approve(0, cur, spender, amount)) } ``` **It is a one-off.** Migrations, inspections, "let me just try this". Keep using `maketx run`, locally and on testnets where the gate is off. The mistake is shipping a run script as a *product surface*, where every user signs arbitrary source every time they press a button. ## it is also half the gas A front-end I looked at sends one transaction per user action, and every one carries a `MsgRun` to grant an allowance and another to revoke it, around the real call. The hygiene is genuinely nice. The `MsgRun` is not cleverness, it is that the generic registry path was the only one their UI had to write once and reuse per asset. Every token involved already exposed `Approve` on its own realm, so the rewrite is mechanical. On that same chain, a single-message approve and a single-message registry write cost: | form | gas used | |---|---| | `MsgCall` `wugnot.Approve(router, 10000000)` | **6,089,073** | | `MsgRun` with one registry write | **12.2M to 15.8M** (10 samples) | Roughly 2x, measured 2026-09-16, a cost class rather than a byte-identical A/B since no solo `MsgRun` approve exists on that chain to pair. The overhead is structural: `MsgRun` pays `ValidateMemPackage`, `TypeCheckMemPackage` and per-byte preprocess gas on every transaction, `MsgCall` pays none of it because the code is already on chain and already type-checked. You compile once instead of once per user per click. `Tx.msgs` is a list, so the sandwich stays one transaction and one signature: you swap message kinds, not the flow. ## where this stops GovDAO proposals stay `MsgRun`-only, because a proposal request carries a func value. That is why the allowlist must never be emptied on a live chain: it would take governance with it and leave no in-band repair. A token nobody wrapped is still unreachable, so ask for the wrappers at listing time, not after. And local development does not change at all: `gnodev`, testnets and your own chain leave `run_submitters` empty. The rule I kept out of all this is short: **if a person will do it more than once, it is a function on a realm.** `maketx run` is for the first time you do something, not the thousandth. If you have a run script you think cannot be compiled, send it to me. Pile 2 is the one worth arguing about and I have only seen my own corner of it.)

Events (2)

StorageDepositEventgno.land/r/moul/blog
+10,963 bytes · 1,096,300 ugnot
StorageDepositEventgno.land/r/moul/blog
+444 bytes · 44,400 ugnot

Response

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




Raw data

Raw transaction payload (content_raw from tx-indexer)
Tx{0AF42C0A0A2F766D2E6D5F63616C6C12E52C0A2867316D616E6672656434376B7A647565633932307A38387766723634796C6B736D646365646C66352214676E6F2E6C616E642F722F6D6F756C2F626C6F672A03536574322666726F6D2D6D616B6574782D72756E2D746F2D74656D706C617465642D636F6E747261637473322D796F75722072756E207363726970742069732061207368656C6C207363726970742C20636F6D70696C65206974320A323032362D30392D3136321C6D736772756E2C6D736763616C6C2C6761732C636F6E747261637473329C2B596F752077726974652061206C6974746C6520602E676E6F602066696C652C20796F752072756E2069742C20697420646F65732065786163746C79207768617420796F752077616E7465642E0A0A60606073680A676E6F6B6579206D616B6574782072756E202D62726F616463617374202D636861696E696420706561726C2D31206D796B6579207363726970742E676E6F0A6060600A0A5468656E20796F7520706F696E74207468652073616D6520636F6D6D616E64206174206D61696E6E657420616E642069742073746F70732E204E6F74206120636F6D70696C65206572726F722C0A6E6F7420612070616E69633A20746865207472616E73616374696F6E206E65766572206765747320746F2072756E20617420616C6C2E2054686520676174652069730A60766D2E72756E5F7375626D697474657273602C20616E20616C6C6F776C697374206F6620616464726573736573207065726D697474656420746F2073656E6420604D736752756E602E20456D7074790A6D65616E73206F66662C206C697374206F6E65206164647265737320616E64206974206973206F6E2C20616E64206D61696E6E657420686173206974206F6E2E0A0A2323207768792069742069732067617465642C2077686963682074656C6C7320796F75207768617420746F20646F2061626F75742069740A0A604D736752756E6020747970652D636865636B7320616E642065786563757465732061726269747261727920736F7572636520696D6D6564696174656C792C20616E64206974206973207468650A6F6E6C7920636F64652D62656172696E67206D6573736167652077697468206E6F206F7468657220676174653A20604D73674164645061636B6167656020636C656172732061206E616D6573706163650A636865636B20616E64206120434C4120636865636B2C207768696C6520604D736752756E602773207061746820697320666F7263656420746F20602F652F3C63616C6C65723E2F72756E6020616E640A686173206E6F206E616D65737061636520746F20636865636B20616761696E73742E0A0A604D73674164645061636B61676560207075626C697368657320636F646520736F6D656F6E652063616E206C6F6F6B2061742C20756E6465722061206E616D6520736F6D656F6E65206F776E732E0A604D736752756E60207075626C697368657320636F64652074686174206578656375746573206F6E636520616E64206C6561766573206E6F2072657669657761626C652061727469666163742E204F6E0A6120636861696E20746861742077616E747320612072657669657720737572666163652C206F6E6C79206F6E65206F662074686F7365207374617973206F70656E2E0A0A232320612072756E207363726970742069732061207368656C6C207363726970742C207374727563747572616C6C790A0A596F752068616E642074686520636861696E20736F757263652C20697420636F6D70696C65732C2072756E7320606D61696E2829602C207468726F7773207468652062696E61727920617761792E0A4E6F7468696E672070657273697374732C206E6F7468696E67206973206E616D65642C206E6F7468696E672063616E2062652063616C6C656420616761696E2E20546861742069730A607368207363726970742E7368602077697468206120626C6F636B636861696E20666F722061206B65726E656C2C20616E642074776F2070726F7065727469657320666F6C6C6F772E0A0A2A2A412072756E207363726970742063617272696573207468696E677320612063616C6C2063616E6E6F742E2A2A20604D736743616C6C60206D61727368616C7320617267756D656E74732066726F6D0A737472696E677320616E642061636365707473207072696D6974697665732C20627974652061727261797320616E64206279746520736C696365733B2065766572797468696E6720656C73650A68697473206070616E69632822756E6578706563746564207479706520696E20636F6E7472616374206172672229602E20412073637269707420686173206E6F2073756368206C696D69740A6265636175736520697420646F6573206E6F74206D61727368616C2074686520617267756D656E742C206974207772697465732074686520636F64652074686174206275696C64732069742E0A546861742069732077687920476F7644414F2070726F706F73616C732061726520604D736752756E602D6F6E6C792E0A0A2A2A412072756E207363726970742072756E7320617320796F752E2A2A2054686520657068656D6572616C20706174682069730A60676E6F2E6C616E642F652F3C796F75722D616464726573733E2F72756E6020616E6420616464726573732064657269766174696F6E207370656369616C2D63617365732069742C20736F0A696E7369646520612072756E2073637269707420227468652063616C6C696E67207265616C6D22202A69732A20796F752E20416E7920415049207265736F6C76696E6720616E206163746F720A66726F6D206974732063616C6C65722061637473206F6E20796F7572206F776E206163636F756E742E2046726F6D2061206465706C6F796564207265616C6D207468652073616D652063616C6C0A616374732061732074686174207265616C6D2E2054686973206973207468652070726F70657274792070656F706C65206275696C64206F6E20776974686F7574206E6F746963696E672C20616E640A746865206F6E65207468617420646F6573206E6F74207375727669766520746865206D6967726174696F6E2E0A0A232320736F20746865206D6967726174696F6E206973206E6F74206120776F726B61726F756E642C20697420697320636F6D70696C696E670A0A412072756E207363726970742069732061207368656C6C207363726970743B2061207265616C6D206973207468652062696E61727920796F752073686970206F6E636520746865207363726970740A73746F7073206368616E67696E672E204D6F766520746865206C6F676963206F6E20636861696E206F6E636520616E6420776861742063726F737365732074686520776972650A61667465727761726473206973207072696D69746976657320616761696E2C20776869636820697320616C6C20604D736743616C6C602065766572206E65656465642E204576657279207363726970740A492068617665206C6F6F6B65642061742066616C6C7320696E206F6E65206F662074687265652070696C65732E0A0A2A2A4974206F6E6C79206E6565647320612066756E632076616C7565206F722061207374727563742E2A2A20412077726170706572207265616C6D20737570706C696573207468650A636C6F737572652C2074686520757365722070617373657320737472696E67732E204D6F73742070726F6A6563747320646964207468697320616C726561647920776974686F7574206672616D696E670A69742074686174207761793A206120726F75746572207265616C6D202A69732A2074686973206669782E0A0A2A2A4974206E6565647320746F2061637420617320746865207369676E65722E2A2A2054686973206973207468652070696C6520746861742062697465732C20616E64204920747269656420746F0A6275696C64207468652077726F6E672066697820666F722069742066697273742C20612067656E65726963206875622074686174206D6F76657320616E20616C6C6F77616E6365206F6E0A616E796F6E65277320626568616C662E2049742063616E6E6F742065786973742C206F6E20707572706F73653A2060496D706572736F6E61746554656C6C657260206973206F6E207468650A70726976617465206C65646765722C20736F20612068656C706572207265616C6D2061637473206F6E6C7920617320697473656C6620616E6420612068756220616374696E67206173206974730A63616C6C6572206973206120636F6E6675736564206465707574792E205468652066697820697320746865206F776E696E67207265616C6D206578706F73696E672074686520656E7472790A706F696E742C20776869636820666F72206120746F6B656E20697320746865207374616E646172642077726170706572207365743A0A0A606060676F0A766172207573657254656C6C6572203D206C65646765722E43616C6C657254656C6C65722829202F2F206163746F72203D2077686F657665722063726F7373656420696E203D20746865207369676E65720A0A66756E6320417070726F766528637572207265616C6D2C207370656E64657220616464726573732C20616D6F756E7420696E74363429207B0A09636865636B457272287573657254656C6C65722E417070726F766528302C206375722C207370656E6465722C20616D6F756E7429290A7D0A6060600A0A2A2A49742069732061206F6E652D6F66662E2A2A204D6967726174696F6E732C20696E7370656374696F6E732C20226C6574206D65206A757374207472792074686973222E204B656570207573696E670A606D616B6574782072756E602C206C6F63616C6C7920616E64206F6E20746573746E657473207768657265207468652067617465206973206F66662E20546865206D697374616B652069730A7368697070696E6720612072756E207363726970742061732061202A70726F6475637420737572666163652A2C2077686572652065766572792075736572207369676E73206172626974726172790A736F757263652065766572792074696D652074686579207072657373206120627574746F6E2E0A0A232320697420697320616C736F2068616C6620746865206761730A0A412066726F6E742D656E642049206C6F6F6B65642061742073656E6473206F6E65207472616E73616374696F6E20706572207573657220616374696F6E2C20616E64206576657279206F6E650A63617272696573206120604D736752756E6020746F206772616E7420616E20616C6C6F77616E636520616E6420616E6F7468657220746F207265766F6B652069742C2061726F756E64207468650A7265616C2063616C6C2E205468652068796769656E652069732067656E75696E656C79206E6963652E2054686520604D736752756E60206973206E6F7420636C657665726E6573732C2069742069730A74686174207468652067656E6572696320726567697374727920706174682077617320746865206F6E6C79206F6E652074686569722055492068616420746F207772697465206F6E636520616E640A7265757365207065722061737365742E20457665727920746F6B656E20696E766F6C76656420616C7265616479206578706F7365642060417070726F766560206F6E20697473206F776E0A7265616C6D2C20736F207468652072657772697465206973206D656368616E6963616C2E204F6E20746861742073616D6520636861696E2C20612073696E676C652D6D6573736167650A617070726F766520616E6420612073696E676C652D6D65737361676520726567697374727920777269746520636F73743A0A0A7C20666F726D207C206761732075736564207C0A7C2D2D2D7C2D2D2D7C0A7C20604D736743616C6C6020607775676E6F742E417070726F766528726F757465722C2031303030303030302960207C202A2A362C3038392C3037332A2A207C0A7C20604D736752756E602077697468206F6E65207265676973747279207772697465207C202A2A31322E324D20746F2031352E384D2A2A202831302073616D706C657329207C0A0A526F7567686C792032782C206D6561737572656420323032362D30392D31362C206120636F737420636C61737320726174686572207468616E206120627974652D6964656E746963616C0A412F422073696E6365206E6F20736F6C6F20604D736752756E6020617070726F766520657869737473206F6E207468617420636861696E20746F20706169722E20546865206F766572686561642069730A7374727563747572616C3A20604D736752756E602070617973206056616C69646174654D656D5061636B616765602C206054797065436865636B4D656D5061636B6167656020616E640A7065722D627974652070726570726F6365737320676173206F6E206576657279207472616E73616374696F6E2C20604D736743616C6C602070617973206E6F6E65206F6620697420626563617573650A74686520636F646520697320616C7265616479206F6E20636861696E20616E6420616C726561647920747970652D636865636B65642E20596F7520636F6D70696C65206F6E636520696E73746561640A6F66206F6E63652070657220757365722070657220636C69636B2E206054782E6D736773602069732061206C6973742C20736F207468652073616E6477696368207374617973206F6E650A7472616E73616374696F6E20616E64206F6E65207369676E61747572653A20796F752073776170206D657373616765206B696E64732C206E6F742074686520666C6F772E0A0A232320776865726520746869732073746F70730A0A476F7644414F2070726F706F73616C73207374617920604D736752756E602D6F6E6C792C206265636175736520612070726F706F73616C2072657175657374206361727269657320612066756E630A76616C75652E2054686174206973207768792074686520616C6C6F776C697374206D757374206E6576657220626520656D7074696564206F6E2061206C69766520636861696E3A20697420776F756C640A74616B6520676F7665726E616E6365207769746820697420616E64206C65617665206E6F20696E2D62616E64207265706169722E204120746F6B656E206E6F626F647920777261707065642069730A7374696C6C20756E726561636861626C652C20736F2061736B20666F7220746865207772617070657273206174206C697374696E672074696D652C206E6F742061667465722E20416E64206C6F63616C0A646576656C6F706D656E7420646F6573206E6F74206368616E676520617420616C6C3A2060676E6F646576602C20746573746E65747320616E6420796F7572206F776E20636861696E206C656176650A6072756E5F7375626D6974746572736020656D7074792E0A0A5468652072756C652049206B657074206F7574206F6620616C6C20746869732069732073686F72743A202A2A6966206120706572736F6E2077696C6C20646F206974206D6F7265207468616E0A6F6E63652C20697420697320612066756E6374696F6E206F6E2061207265616C6D2E2A2A20606D616B6574782072756E6020697320666F72207468652066697273742074696D6520796F7520646F0A736F6D657468696E672C206E6F74207468652074686F7573616E6474682E0A0A496620796F75206861766520612072756E2073637269707420796F75207468696E6B2063616E6E6F7420626520636F6D70696C65642C2073656E6420697420746F206D652E2050696C6520322069730A746865206F6E6520776F7274682061726775696E672061626F757420616E6420492068617665206F6E6C79207365656E206D79206F776E20636F726E6572206F662069742E0ABC240A0A2F766D2E6D5F63616C6C12AD240A2867316D616E6672656434376B7A647565633932307A38387766723634796C6B736D646365646C66352214676E6F2E6C616E642F722F6D6F756C2F626C6F672A0353657432096D79676E6F7363616E321173686172696E67206D79676E6F7363616E320A323032362D30392D323332236D79676E6F7363616E2C676E6F73636F70652C746F6F6C696E672C6578706C6F7265723296233E202A2A6D79676E6F7363616E206973206E6F77205B676E6F73636F70655D2868747470733A2F2F676E6F73636F70652E636F6D292E2A2A2052656E616D656420323032362D30392D32382E20546869730A3E20706F7374206973206C65667420617320697420776173207772697474656E2C207769746820746865206F6C64206E616D65207468726F7567686F75742C20626563617573652069742069730A3E207768617420492073616964206174207468652074696D652E2045766572797468696E6720696E206974207374696C6C20776F726B733A2073616D6520746F6F6C2C2073616D6520646174612C0A3E20616E6420606D79676E6F7363616E2E6D6F756C2E7032702E7465616D602072656469726563747320746F2060676E6F73636F70652E636F6D602E205768792C20616E642077686174206D6F7665643A0A3E205B676E6F76657273652F676E6F73636F70655D2868747470733A2F2F6769746875622E636F6D2F676E6F76657273652F676E6F73636F70652F626C6F622F6D61696E2F646F63732F72656E616D652E6D64292E0A0A6D79676E6F7363616E206973206120424920746F6F6C20492077726F746520746F20616E73776572206D79206F776E207175657374696F6E732061626F757420676E6F2E6C616E642E204920686176650A6265656E20616464696E6720746F2069742073696E636520417072696C20616E64206E6576657220616E6E6F756E6365642069742C2062656361757365206974206973206E6F742066696E69736865640A616E642069742077696C6C206E6F742062652E0A0A5468656E2070656F706C6520666F756E64205B69745D2868747470733A2F2F6D79676E6F7363616E2E6D6F756C2E7032702E7465616D292C20736169642074686579206C696B65642069742C20616E640A61736B6564207768656E204920776F756C642073686172652069742E20536F3A20686572652069742069732E204E6F7420612070726F647563742C206E6F74206F6666696369616C2C20616E6420490A61646420746F2069742065766572792074696D65206974206661696C7320746F20616E737765722061206E6577207175657374696F6E2E0A0A2323207768617420492061637475616C6C79206F70656E20697420666F720A0A47656E65726963206578706C6F7265727320617265206275696C742061726F756E6420626C6F636B7320616E64207472616E73616374696F6E732E2054686F736520617265207461626C650A7374616B65732E204D79207175657374696F6E732077657265206120646966666572656E742073686170653A2077686174206973206465706C6F7965642C2077686F2063616C6C732069742C20616E640A77686174206368616E6765642074686973207765656B2E0A0A536F207468652066726F6E74207061676520697320612077696E646F772C206E6F742061206C65646765722E205069636B20612072616E67652C2073656520697420616761696E7374207468650A72616E6765206265666F72652069742C207468656E2066697665206C697374733A0A0A2D202A2A686F74207265616C6D732A2A2C2062792063616C6C732C2077697468207468652063616C6C657220636F756E7420626573696465207468656D2E20332C3831372063616C6C732066726F6D0A202032362061646472657373657320616E6420342C3939382066726F6D2034363120617265206E6F74207468652073616D65206576656E742C20616E64206F6E65206E756D6265722063616E6E6F740A202074656C6C20796F7520776869636820796F7520617265206C6F6F6B696E672061742E0A2D202A2A686F74206173736574732A2A3A2075676E6F742061742031392C323830207472616E73666572732066726F6D203938302073656E646572732C20474E5320617420362C3332342066726F6D203134312E0A2D202A2A686F7420646576656C6F706572732A2A2C20666C6167676564207768656E206974206973207468656972206669727374206465706C6F7920657665722E205468726565206F66207468650A2020746F7020666F75722074686973207765656B206172652066697273742D74696D6572732E0A2D202A2A686F74206C69627261726965732A2A2C2072616E6B6564206279202A6E65772A20696D706F727465727320726174686572207468616E20746F74616C2E2060702F6E742F75666D74600A2020746F6F6B203233206E657720696D706F72746572732074686973207765656B20616761696E73742031313320616C6C2074696D652E0A2D202A2A6E6F7461626C65207472616E73666572732E2A2A0A0A556E64657220746861743A207265616C6D20736F757263652C20696D706F7274732C20646570656E64656E74732C2063616C6C6572732C2074686520604D736752756E6020736372697074730A74686174207573652061207265616C6D20776974686F757420696D706F7274696E672069742C206120646570656E64656E63792067726170682C20616E642073637265656E73686F7473206F660A776861742065616368207265616C6D2061637475616C6C79206C6F6F6B73206C696B652E0A0A23232074776F207468696E67732074686520696E646578657220746175676874206D650A0A48616C66206F66207468697320697320612066726F6E74656E642E20546865206F746865722068616C66206973206C6561726E696E6720686F77207468650A5B74782D696E64657865725D2868747470733A2F2F6769746875622E636F6D2F676E6F6C616E672F74782D696E6465786572292061637475616C6C7920626568617665732C2077686963682069730A77686572652074686520696E746572657374696E672062756773206C6976652E0A0A2A2A5468657265206973206E6F20706167696E6174696F6E2E2A2A20606765745472616E73616374696F6E73602074616B6573206077686572656020616E6420606F72646572602C20616E640A6E6F7468696E6720656C73652E20546865207365727665722063617073206120726573756C74207365742061742031302C30303020656C656D656E74732C20616E64206F6E207265616368696E670A697420746865207265736F6C7665722073746F707320616E642072657475726E732074686520726F777320697420686173202A616C6F6E67736964652A2061204772617068514C206572726F722E0A536F20612063617070656420726573706F6E7365206973207061727469616C2C206E6F7420656D7074792C20616E6420746865206F6E6C792077617920746F2077616C6B2061206C61726765720A7365742069732074686520626C6F636B206865696768742066696C7465723A0A0A6060606772617068716C0A6765745472616E73616374696F6E732877686572653A207B0A2020626C6F636B5F6865696768743A207B2067743A203235303030302C206C74653A20323630303030207D0A7D29207B206861736820626C6F636B5F686569676874207D0A6060600A0A5265616420746861742077726F6E6720616E6420796F752073686F772061207472756E636174656420686973746F7279206173206966206974207765726520636F6D706C6574652E0A0A2A2A4F6E6520756E6B6E6F776E2074797065206B696C6C732065766572792071756572792E2A2A204D657373616765207479706573206172652073656C656374656420696E73696465206F6E650A73686172656420667261676D656E74207365743A0A0A6060606772617068716C0A6D65737361676573207B2076616C7565207B205F5F747970656E616D650A20202E2E2E206F6E204D736743616C6C202020202020202020207B2063616C6C657220706B675F706174682066756E632061726773207D0A20202E2E2E206F6E204D73674164645061636B616765202020207B2063726561746F72207061636B616765207B206E616D652070617468207D207D0A20202E2E2E206F6E204D7367456E61626C655061636B616765207B20617070726F76657220706B675F70617468207D0A7D207D0A6060600A0A416E20696E6465786572207468617420646F6573206E6F7420646566696E6520604D7367456E61626C655061636B616765602072656A65637473202A2A65766572792A2A207472616E73616374696F6E0A71756572792C206E6F74206A75737420746865206F6E6573207468617420776F756C642068617665206D6174636865642069743A0A0A6060600A73796E63207061636B616765733A20696E64657865722072657475726E6564203432323A20556E6B6E6F776E207479706520224D7367456E61626C655061636B616765220A6060600A0A5468617420746F6F6B20612077686F6C6520636861696E27732073796E63206F66666C696E652E20416E642074686520747970657320736869707065642073657061726174656C792C20736F0A6D61696E6E657420646566696E657320604D7367456E61626C655061636B6167656020616E64206E6F7420604D736743726561746553657373696F6E603A2070726F62696E6720666F72206F6E650A616E642073656C656374696E6720746865206F74686572206661696C73206576657279207175657279207768696C65207265706F7274696E6720737570706F72742E0A0A232320776865726520492077616E7420746F2074616B652069740A0A4120646576656C6F7065722073656374696F6E2C206D6F73746C792E205265616C6D2073746174652061732061207265616461626C65207472656520696E7374656164206F66206120626C6F622E0A436F646520736561726368206163726F737320657665727920602E676E6F602066696C65206F6E20636861696E2E20412074696D65206D616368696E652C20626563617573652074686520636861696E0A6F76657277726974657320737461746520616E642074686520696E646578657220697320746865206F6E6C79207468696E67207761746368696E672E20416E64206120726561642D6F6E6C790A656E64706F696E7420736F20616E206167656E742063616E2061736B207768617420492061736B207468726F756768207468652055492E0A0A232320706C6561736520627265616B2069740A0A5B676E6F76657273652F6D79676E6F7363616E5D2868747470733A2F2F6769746875622E636F6D2F676E6F76657273652F6D79676E6F7363616E292E204F6E6520476F2062696E6172792C207468650A66726F6E74656E6420656D6265646465642C2053514C69746520666F722074686520677261706820616E616C797369732E205468650A5B524541444D455D2868747470733A2F2F6769746875622E636F6D2F676E6F76657273652F6D79676E6F7363616E23726561646D6529207361797320686F7720746F2072756E20796F7572206F776E0A616761696E737420796F7572206F776E206E6F64652C207768696368204920776F756C64206C696B65206D6F72652070656F706C6520746F20646F2E0A0A5768617420492077616E74206D6F737420697320616E206973737565207768656E20697420646F6573206E6F7420616E7377657220796F7572207175657374696F6E2E2045766572790A6665617475726520696E2074686572652063616D652066726F6D2061207175657374696F6E204920636F756C64206E6F7420616E737765722C20616E642049206F6E6C792068617665206D696E652E0A5365636F6E64206D6F73743A2074656C6C206D65207768656E2061206E756D626572206C6F6F6B732077726F6E672E20536F6D652068617665206265656E2C20616E6420616E206578706C6F7265720A7468617420697320636F6E666964656E746C792077726F6E6720697320776F727365207468616E206E6F6E652E0A0A4920616D206E6F74206275696C64696E6720746865206578706C6F72657220666F7220676E6F2E6C616E642E205B676E6F7363616E2E696F5D2868747470733A2F2F676E6F7363616E2E696F292069730A746865206F6E6520746F2068616E64206120737472616E6765722E204920616D206275696C64696E6720746865206F6E6520492077616E74206F70656E20696E206120746162207768696C6520490A776F726B2C20616E64206974207475726E73206F7574206120666577206F746865722070656F706C652077616E7420746861742074616220746F6F2E121208F0D08F13120B32303035313075676E6F741AA8010A3A0A132F746D2E5075624B6579536563703235366B3112230A210200524A3F8D2C003A89C43F45FEAF6EB8ED45B6E3A35F7BBE6B3B49FF9E2D83C81240B239D2D3885B546D0F47F661ED7143C2F9BC65EFAFD40D8E0B612C76CEF5B8A34D8884EECD9B4FBEA829BF154228B401CF3CCEE848C147EDEE5F322CD60AA1FE1A2867317171717171717171717171717171717171717171717171717171717171717171716C75757865}
{
  "__typename": "MsgCall",
  "caller": "g1manfred47kzduec920z88wfr64ylksmdcedlf5",
  "send": "",
  "pkg_path": "gno.land/r/moul/blog",
  "func": "Set",
  "args": [
    "from-maketx-run-to-templated-contracts",
    "your run script is a shell script, compile it",
    "2026-09-16",
    "msgrun,msgcall,gas,contracts",
    "You write a little `.gno` file, you run it, it does exactly what you wanted.\n\n```sh\ngnokey maketx run -broadcast -chainid pearl-1 mykey script.gno\n```\n\nThen you point the same command at mainnet and it stops. Not a compile error,\nnot a panic: the transaction never gets to run at all. The gate is\n`vm.run_submitters`, an allowlist of addresses permitted to send `MsgRun`. Empty\nmeans off, list one address and it is on, and mainnet has it on.\n\n## why it is gated, which tells you what to do about it\n\n`MsgRun` type-checks and executes arbitrary source immediately, and it is the\nonly code-bearing message with no other gate: `MsgAddPackage` clears a namespace\ncheck and a CLA check, while `MsgRun`'s path is forced to `/e/<caller>/run` and\nhas no namespace to check against.\n\n`MsgAddPackage` publishes code someone can look at, under a name someone owns.\n`MsgRun` publishes code that executes once and leaves no reviewable artifact. On\na chain that wants a review surface, only one of those stays open.\n\n## a run script is a shell script, structurally\n\nYou hand the chain source, it compiles, runs `main()`, throws the binary away.\nNothing persists, nothing is named, nothing can be called again. That is\n`sh script.sh` with a blockchain for a kernel, and two properties follow.\n\n**A run script carries things a call cannot.** `MsgCall` marshals arguments from\nstrings and accepts primitives, byte arrays and byte slices; everything else\nhits `panic(\"unexpected type in contract arg\")`. A script has no such limit\nbecause it does not marshal the argument, it writes the code that builds it.\nThat is why GovDAO proposals are `MsgRun`-only.\n\n**A run script runs as you.** The ephemeral path is\n`gno.land/e/<your-address>/run` and address derivation special-cases it, so\ninside a run script \"the calling realm\" *is* you. Any API resolving an actor\nfrom its caller acts on your own account. From a deployed realm the same call\nacts as that realm. This is the property people build on without noticing, and\nthe one that does not survive the migration.\n\n## so the migration is not a workaround, it is compiling\n\nA run script is a shell script; a realm is the binary you ship once the script\nstops changing. Move the logic on chain once and what crosses the wire\nafterwards is primitives again, which is all `MsgCall` ever needed. Every script\nI have looked at falls in one of three piles.\n\n**It only needs a func value or a struct.** A wrapper realm supplies the\nclosure, the user passes strings. Most projects did this already without framing\nit that way: a router realm *is* this fix.\n\n**It needs to act as the signer.** This is the pile that bites, and I tried to\nbuild the wrong fix for it first, a generic hub that moves an allowance on\nanyone's behalf. It cannot exist, on purpose: `ImpersonateTeller` is on the\nprivate ledger, so a helper realm acts only as itself and a hub acting as its\ncaller is a confused deputy. The fix is the owning realm exposing the entry\npoint, which for a token is the standard wrapper set:\n\n```go\nvar userTeller = ledger.CallerTeller() // actor = whoever crossed in = the signer\n\nfunc Approve(cur realm, spender address, amount int64) {\n\tcheckErr(userTeller.Approve(0, cur, spender, amount))\n}\n```\n\n**It is a one-off.** Migrations, inspections, \"let me just try this\". Keep using\n`maketx run`, locally and on testnets where the gate is off. The mistake is\nshipping a run script as a *product surface*, where every user signs arbitrary\nsource every time they press a button.\n\n## it is also half the gas\n\nA front-end I looked at sends one transaction per user action, and every one\ncarries a `MsgRun` to grant an allowance and another to revoke it, around the\nreal call. The hygiene is genuinely nice. The `MsgRun` is not cleverness, it is\nthat the generic registry path was the only one their UI had to write once and\nreuse per asset. Every token involved already exposed `Approve` on its own\nrealm, so the rewrite is mechanical. On that same chain, a single-message\napprove and a single-message registry write cost:\n\n| form | gas used |\n|---|---|\n| `MsgCall` `wugnot.Approve(router, 10000000)` | **6,089,073** |\n| `MsgRun` with one registry write | **12.2M to 15.8M** (10 samples) |\n\nRoughly 2x, measured 2026-09-16, a cost class rather than a byte-identical\nA/B since no solo `MsgRun` approve exists on that chain to pair. The overhead is\nstructural: `MsgRun` pays `ValidateMemPackage`, `TypeCheckMemPackage` and\nper-byte preprocess gas on every transaction, `MsgCall` pays none of it because\nthe code is already on chain and already type-checked. You compile once instead\nof once per user per click. `Tx.msgs` is a list, so the sandwich stays one\ntransaction and one signature: you swap message kinds, not the flow.\n\n## where this stops\n\nGovDAO proposals stay `MsgRun`-only, because a proposal request carries a func\nvalue. That is why the allowlist must never be emptied on a live chain: it would\ntake governance with it and leave no in-band repair. A token nobody wrapped is\nstill unreachable, so ask for the wrappers at listing time, not after. And local\ndevelopment does not change at all: `gnodev`, testnets and your own chain leave\n`run_submitters` empty.\n\nThe rule I kept out of all this is short: **if a person will do it more than\nonce, it is a function on a realm.** `maketx run` is for the first time you do\nsomething, not the thousandth.\n\nIf you have a run script you think cannot be compiled, send it to me. Pile 2 is\nthe one worth arguing about and I have only seen my own corner of it."
  ],
  "max_deposit": ""
}
#1 vm/execgno.land/r/moul/blog.Set(mygnoscan, sharing mygnoscan, 2026-09-23, mygnoscan,gnoscope,tooling,explorer, > **mygnoscan is now [gnoscope](https://gnoscope.com).** Renamed 2026-09-28. This > post is left as it was written, with the old name throughout, because it is > what I said at the time. Everything in it still works: same tool, same data, > and `mygnoscan.moul.p2p.team` redirects to `gnoscope.com`. Why, and what moved: > [gnoverse/gnoscope](https://github.com/gnoverse/gnoscope/blob/main/docs/rename.md). mygnoscan is a BI tool I wrote to answer my own questions about gno.land. I have been adding to it since April and never announced it, because it is not finished and it will not be. Then people found [it](https://mygnoscan.moul.p2p.team), said they liked it, and asked when I would share it. So: here it is. Not a product, not official, and I add to it every time it fails to answer a new question. ## what I actually open it for Generic explorers are built around blocks and transactions. Those are table stakes. My questions were a different shape: what is deployed, who calls it, and what changed this week. So the front page is a window, not a ledger. Pick a range, see it against the range before it, then five lists: - **hot realms**, by calls, with the caller count beside them. 3,817 calls from 26 addresses and 4,998 from 461 are not the same event, and one number cannot tell you which you are looking at. - **hot assets**: ugnot at 19,280 transfers from 980 senders, GNS at 6,324 from 141. - **hot developers**, flagged when it is their first deploy ever. Three of the top four this week are first-timers. - **hot libraries**, ranked by *new* importers rather than total. `p/nt/ufmt` took 23 new importers this week against 113 all time. - **notable transfers.** Under that: realm source, imports, dependents, callers, the `MsgRun` scripts that use a realm without importing it, a dependency graph, and screenshots of what each realm actually looks like. ## two things the indexer taught me Half of this is a frontend. The other half is learning how the [tx-indexer](https://github.com/gnolang/tx-indexer) actually behaves, which is where the interesting bugs live. **There is no pagination.** `getTransactions` takes `where` and `order`, and nothing else. The server caps a result set at 10,000 elements, and on reaching it the resolver stops and returns the rows it has *alongside* a GraphQL error. So a capped response is partial, not empty, and the only way to walk a larger set is the block height filter: ```graphql getTransactions(where: { block_height: { gt: 250000, lte: 260000 } }) { hash block_height } ``` Read that wrong and you show a truncated history as if it were complete. **One unknown type kills every query.** Message types are selected inside one shared fragment set: ```graphql messages { value { __typename ... on MsgCall { caller pkg_path func args } ... on MsgAddPackage { creator package { name path } } ... on MsgEnablePackage { approver pkg_path } } } ``` An indexer that does not define `MsgEnablePackage` rejects **every** transaction query, not just the ones that would have matched it: ``` sync packages: indexer returned 422: Unknown type "MsgEnablePackage" ``` That took a whole chain's sync offline. And the types shipped separately, so mainnet defines `MsgEnablePackage` and not `MsgCreateSession`: probing for one and selecting the other fails every query while reporting support. ## where I want to take it A developer section, mostly. Realm state as a readable tree instead of a blob. Code search across every `.gno` file on chain. A time machine, because the chain overwrites state and the indexer is the only thing watching. And a read-only endpoint so an agent can ask what I ask through the UI. ## please break it [gnoverse/mygnoscan](https://github.com/gnoverse/mygnoscan). One Go binary, the frontend embedded, SQLite for the graph analysis. The [README](https://github.com/gnoverse/mygnoscan#readme) says how to run your own against your own node, which I would like more people to do. What I want most is an issue when it does not answer your question. Every feature in there came from a question I could not answer, and I only have mine. Second most: tell me when a number looks wrong. Some have been, and an explorer that is confidently wrong is worse than none. I am not building the explorer for gno.land. [gnoscan.io](https://gnoscan.io) is the one to hand a stranger. I am building the one I want open in a tab while I work, and it turns out a few other people want that tab too.)
{
  "__typename": "MsgCall",
  "caller": "g1manfred47kzduec920z88wfr64ylksmdcedlf5",
  "send": "",
  "pkg_path": "gno.land/r/moul/blog",
  "func": "Set",
  "args": [
    "mygnoscan",
    "sharing mygnoscan",
    "2026-09-23",
    "mygnoscan,gnoscope,tooling,explorer",
    "> **mygnoscan is now [gnoscope](https://gnoscope.com).** Renamed 2026-09-28. This\n> post is left as it was written, with the old name throughout, because it is\n> what I said at the time. Everything in it still works: same tool, same data,\n> and `mygnoscan.moul.p2p.team` redirects to `gnoscope.com`. Why, and what moved:\n> [gnoverse/gnoscope](https://github.com/gnoverse/gnoscope/blob/main/docs/rename.md).\n\nmygnoscan is a BI tool I wrote to answer my own questions about gno.land. I have\nbeen adding to it since April and never announced it, because it is not finished\nand it will not be.\n\nThen people found [it](https://mygnoscan.moul.p2p.team), said they liked it, and\nasked when I would share it. So: here it is. Not a product, not official, and I\nadd to it every time it fails to answer a new question.\n\n## what I actually open it for\n\nGeneric explorers are built around blocks and transactions. Those are table\nstakes. My questions were a different shape: what is deployed, who calls it, and\nwhat changed this week.\n\nSo the front page is a window, not a ledger. Pick a range, see it against the\nrange before it, then five lists:\n\n- **hot realms**, by calls, with the caller count beside them. 3,817 calls from\n  26 addresses and 4,998 from 461 are not the same event, and one number cannot\n  tell you which you are looking at.\n- **hot assets**: ugnot at 19,280 transfers from 980 senders, GNS at 6,324 from 141.\n- **hot developers**, flagged when it is their first deploy ever. Three of the\n  top four this week are first-timers.\n- **hot libraries**, ranked by *new* importers rather than total. `p/nt/ufmt`\n  took 23 new importers this week against 113 all time.\n- **notable transfers.**\n\nUnder that: realm source, imports, dependents, callers, the `MsgRun` scripts\nthat use a realm without importing it, a dependency graph, and screenshots of\nwhat each realm actually looks like.\n\n## two things the indexer taught me\n\nHalf of this is a frontend. The other half is learning how the\n[tx-indexer](https://github.com/gnolang/tx-indexer) actually behaves, which is\nwhere the interesting bugs live.\n\n**There is no pagination.** `getTransactions` takes `where` and `order`, and\nnothing else. The server caps a result set at 10,000 elements, and on reaching\nit the resolver stops and returns the rows it has *alongside* a GraphQL error.\nSo a capped response is partial, not empty, and the only way to walk a larger\nset is the block height filter:\n\n```graphql\ngetTransactions(where: {\n  block_height: { gt: 250000, lte: 260000 }\n}) { hash block_height }\n```\n\nRead that wrong and you show a truncated history as if it were complete.\n\n**One unknown type kills every query.** Message types are selected inside one\nshared fragment set:\n\n```graphql\nmessages { value { __typename\n  ... on MsgCall          { caller pkg_path func args }\n  ... on MsgAddPackage    { creator package { name path } }\n  ... on MsgEnablePackage { approver pkg_path }\n} }\n```\n\nAn indexer that does not define `MsgEnablePackage` rejects **every** transaction\nquery, not just the ones that would have matched it:\n\n```\nsync packages: indexer returned 422: Unknown type \"MsgEnablePackage\"\n```\n\nThat took a whole chain's sync offline. And the types shipped separately, so\nmainnet defines `MsgEnablePackage` and not `MsgCreateSession`: probing for one\nand selecting the other fails every query while reporting support.\n\n## where I want to take it\n\nA developer section, mostly. Realm state as a readable tree instead of a blob.\nCode search across every `.gno` file on chain. A time machine, because the chain\noverwrites state and the indexer is the only thing watching. And a read-only\nendpoint so an agent can ask what I ask through the UI.\n\n## please break it\n\n[gnoverse/mygnoscan](https://github.com/gnoverse/mygnoscan). One Go binary, the\nfrontend embedded, SQLite for the graph analysis. The\n[README](https://github.com/gnoverse/mygnoscan#readme) says how to run your own\nagainst your own node, which I would like more people to do.\n\nWhat I want most is an issue when it does not answer your question. Every\nfeature in there came from a question I could not answer, and I only have mine.\nSecond most: tell me when a number looks wrong. Some have been, and an explorer\nthat is confidently wrong is worse than none.\n\nI am not building the explorer for gno.land. [gnoscan.io](https://gnoscan.io) is\nthe one to hand a stranger. I am building the one I want open in a tab while I\nwork, and it turns out a few other people want that tab too."
  ],
  "max_deposit": ""
}