{ "contractName": "NameRegistry", "constructorInputs": [ { "name": "fundLock", "type": "bytes" }, { "name": "stewardPk", "type": "pubkey" }, { "name": "commitBoxCode", "type": "bytes" }, { "name": "renewalSats", "type": "int" }, { "name": "premiumSats", "type": "int" }, { "name": "floorSats", "type": "int" }, { "name": "graceBlocks", "type": "int" }, { "name": "blocksPerYear", "type": "int" }, { "name": "ownerPercentIdle", "type": "int" }, { "name": "expiry", "type": "bytes4" }, { "name": "ownerPkh", "type": "bytes20" } ], "abi": [ { "name": "renew", "inputs": [ { "name": "pk", "type": "pubkey" }, { "name": "s", "type": "sig" }, { "name": "years", "type": "int" } ] }, { "name": "transfer", "inputs": [ { "name": "pk", "type": "pubkey" }, { "name": "s", "type": "sig" }, { "name": "newOwnerPkh", "type": "bytes20" } ] }, { "name": "takeover", "inputs": [ { "name": "newOwnerPkh", "type": "bytes20" }, { "name": "salt", "type": "bytes" } ] }, { "name": "release", "inputs": [ { "name": "pk", "type": "pubkey" }, { "name": "s", "type": "sig" } ] }, { "name": "migrate", "inputs": [ { "name": "pk", "type": "pubkey" }, { "name": "s", "type": "sig" }, { "name": "approval", "type": "datasig" }, { "name": "newCode", "type": "bytes" }, { "name": "newState", "type": "bytes" } ] } ], "bytecode": "OP_11 OP_PICK OP_0 OP_NUMEQUAL OP_IF OP_12 OP_PICK OP_HASH160 OP_11 OP_PICK OP_EQUALVERIFY OP_13 OP_ROLL OP_13 OP_ROLL OP_CHECKSIGVERIFY OP_12 OP_PICK OP_1 OP_GREATERTHANOREQUAL OP_VERIFY OP_9 OP_ROLL OP_BIN2NUM OP_12 OP_PICK OP_9 OP_ROLL OP_MUL OP_ADD 14 OP_10 OP_ROLL OP_CAT OP_4 OP_CAT OP_SWAP OP_4 OP_NUM2BIN OP_CAT OP_ACTIVEBYTECODE 1a OP_SPLIT OP_NIP OP_CAT OP_HASH256 OP_0 OP_OUTPUTBYTECODE aa20 OP_ROT OP_CAT 87 OP_CAT OP_EQUALVERIFY OP_0 OP_OUTPUTTOKENCATEGORY OP_INPUTINDEX OP_UTXOTOKENCATEGORY OP_EQUALVERIFY OP_0 OP_OUTPUTTOKENCOMMITMENT OP_INPUTINDEX OP_UTXOTOKENCOMMITMENT OP_EQUALVERIFY OP_0 OP_OUTPUTVALUE OP_INPUTINDEX OP_UTXOVALUE OP_GREATERTHANOREQUAL OP_VERIFY OP_1 OP_OUTPUTBYTECODE OP_EQUALVERIFY OP_1 OP_OUTPUTVALUE OP_3 OP_ROLL OP_9 OP_ROLL OP_MUL OP_GREATERTHANOREQUAL OP_VERIFY OP_1 OP_OUTPUTTOKENCATEGORY OP_0 OP_EQUALVERIFY OP_2DROP OP_2DROP OP_2DROP OP_DROP OP_1 OP_ELSE OP_11 OP_PICK OP_1 OP_NUMEQUAL OP_IF OP_14 OP_ROLL OP_SIZE 14 OP_EQUALVERIFY OP_13 OP_PICK OP_HASH160 OP_12 OP_ROLL OP_EQUALVERIFY OP_13 OP_ROLL OP_13 OP_ROLL OP_CHECKSIGVERIFY 14 OP_SWAP OP_CAT OP_4 OP_CAT OP_10 OP_ROLL OP_CAT OP_ACTIVEBYTECODE 1a OP_SPLIT OP_NIP OP_CAT OP_HASH256 OP_0 OP_OUTPUTBYTECODE aa20 OP_ROT OP_CAT 87 OP_CAT OP_EQUALVERIFY OP_0 OP_OUTPUTTOKENCATEGORY OP_INPUTINDEX OP_UTXOTOKENCATEGORY OP_EQUALVERIFY OP_0 OP_OUTPUTTOKENCOMMITMENT OP_INPUTINDEX OP_UTXOTOKENCOMMITMENT OP_EQUALVERIFY OP_0 OP_OUTPUTVALUE OP_INPUTINDEX OP_UTXOVALUE OP_GREATERTHANOREQUAL OP_VERIFY OP_2DROP OP_2DROP OP_2DROP OP_2DROP OP_2DROP OP_1 OP_ELSE OP_11 OP_PICK OP_2 OP_NUMEQUAL OP_IF OP_12 OP_ROLL OP_SIZE 14 OP_EQUALVERIFY OP_10 OP_ROLL OP_BIN2NUM OP_DUP OP_CHECKLOCKTIMEVERIFY OP_DROP OP_TXLOCKTIME OP_DUP 0065cd1d OP_LESSTHAN OP_VERIFY OP_SWAP OP_9 OP_PICK OP_ADD OP_8 OP_PICK OP_0 OP_2OVER OP_LESSTHAN OP_IF OP_10 OP_PICK OP_10 OP_PICK OP_12 OP_PICK OP_SUB OP_4 OP_PICK OP_6 OP_PICK OP_SUB OP_MUL OP_13 OP_PICK OP_DIV OP_ADD OP_ROT OP_DROP OP_SWAP OP_OVER OP_14 OP_PICK OP_MUL 64 OP_DIV OP_NIP OP_ENDIF OP_INPUTINDEX OP_UTXOTOKENCOMMITMENT 11 OP_ROLL OP_CAT OP_HASH256 14 OP_6 OP_PICK OP_CAT 20 OP_CAT OP_SWAP OP_CAT OP_8 OP_ROLL OP_CAT OP_1 OP_UTXOBYTECODE aa20 OP_ROT OP_HASH256 OP_CAT 87 OP_CAT OP_EQUALVERIFY 14 OP_5 OP_ROLL OP_CAT OP_4 OP_CAT OP_4 OP_ROLL OP_11 OP_ROLL OP_ADD OP_4 OP_NUM2BIN OP_CAT OP_ACTIVEBYTECODE 1a OP_SPLIT OP_NIP OP_CAT OP_HASH256 OP_0 OP_OUTPUTBYTECODE aa20 OP_ROT OP_CAT 87 OP_CAT OP_EQUALVERIFY OP_0 OP_OUTPUTTOKENCATEGORY OP_INPUTINDEX OP_UTXOTOKENCATEGORY OP_EQUALVERIFY OP_0 OP_OUTPUTTOKENCOMMITMENT OP_INPUTINDEX OP_UTXOTOKENCOMMITMENT OP_EQUALVERIFY OP_0 OP_OUTPUTVALUE OP_INPUTINDEX OP_UTXOVALUE OP_GREATERTHANOREQUAL OP_VERIFY OP_1 OP_OUTPUTBYTECODE OP_4 OP_ROLL OP_EQUALVERIFY OP_1 OP_OUTPUTVALUE OP_ROT OP_2 OP_PICK OP_SUB OP_GREATERTHANOREQUAL OP_VERIFY OP_1 OP_OUTPUTTOKENCATEGORY OP_0 OP_EQUALVERIFY OP_DUP OP_0 OP_GREATERTHAN OP_IF OP_2 OP_OUTPUTBYTECODE 76a914 OP_10 OP_PICK OP_CAT 88ac OP_CAT OP_EQUALVERIFY OP_2 OP_OUTPUTVALUE OP_OVER OP_GREATERTHANOREQUAL OP_VERIFY OP_2 OP_OUTPUTTOKENCATEGORY OP_0 OP_EQUALVERIFY OP_ENDIF OP_2DROP OP_2DROP OP_2DROP OP_2DROP OP_2DROP OP_1 OP_ELSE OP_11 OP_PICK OP_3 OP_NUMEQUAL OP_IF OP_12 OP_PICK OP_HASH160 OP_11 OP_ROLL OP_EQUALVERIFY OP_12 OP_ROLL OP_12 OP_ROLL OP_CHECKSIGVERIFY OP_INPUTINDEX OP_UTXOTOKENCATEGORY OP_TXOUTPUTCOUNT OP_4 OP_LESSTHANOREQUAL OP_VERIFY OP_0 OP_OUTPUTTOKENCATEGORY OP_OVER OP_EQUAL OP_NOT OP_VERIFY OP_TXOUTPUTCOUNT OP_1 OP_GREATERTHAN OP_IF OP_1 OP_OUTPUTTOKENCATEGORY OP_OVER OP_EQUAL OP_NOT OP_VERIFY OP_ENDIF OP_TXOUTPUTCOUNT OP_2 OP_GREATERTHAN OP_IF OP_2 OP_OUTPUTTOKENCATEGORY OP_OVER OP_EQUAL OP_NOT OP_VERIFY OP_ENDIF OP_TXOUTPUTCOUNT OP_3 OP_GREATERTHAN OP_IF OP_3 OP_OUTPUTTOKENCATEGORY OP_OVER OP_EQUAL OP_NOT OP_VERIFY OP_ENDIF OP_2DROP OP_2DROP OP_2DROP OP_2DROP OP_2DROP OP_2DROP OP_1 OP_ELSE OP_11 OP_ROLL OP_4 OP_NUMEQUALVERIFY OP_11 OP_PICK OP_HASH160 OP_11 OP_ROLL OP_EQUALVERIFY OP_11 OP_ROLL OP_11 OP_ROLL OP_CHECKSIGVERIFY OP_10 OP_ROLL OP_11 OP_PICK OP_HASH256 OP_3 OP_ROLL OP_CHECKDATASIGVERIFY OP_10 OP_ROLL OP_10 OP_ROLL OP_CAT OP_HASH256 OP_0 OP_OUTPUTBYTECODE aa20 OP_ROT OP_CAT 87 OP_CAT OP_EQUALVERIFY OP_0 OP_OUTPUTTOKENCATEGORY OP_INPUTINDEX OP_UTXOTOKENCATEGORY OP_EQUALVERIFY OP_0 OP_OUTPUTTOKENCOMMITMENT OP_INPUTINDEX OP_UTXOTOKENCOMMITMENT OP_EQUALVERIFY OP_0 OP_OUTPUTVALUE OP_INPUTINDEX OP_UTXOVALUE OP_GREATERTHANOREQUAL OP_VERIFY OP_2DROP OP_2DROP OP_2DROP OP_2DROP OP_DROP OP_1 OP_ENDIF OP_ENDIF OP_ENDIF OP_ENDIF", "source": "pragma cashscript ^0.13.0;\n\n// NameRegistry v1 — the covenant that holds a name certificate and enforces\n// its lifecycle (Decentralized.DNS/DESIGN-covenant-registry.md).\n//\n// STATUS: chipnet draft. NOT REVIEWED. A flaw here either locks every name\n// forever or lets anyone take one; nothing built from this file may hold a\n// mainnet name until someone who did not write it has reviewed it.\n//\n// The certificate (an immutable NFT whose commitment is the name) sits in an\n// output locked by this script. Two values change over a name's life — who\n// owns it and when it expires — and they are the LAST two constructor\n// arguments, which CashScript pushes FIRST. The redeem script therefore begins\n//\n// 0x14 0x04 \n//\n// and every path that keeps the name re-creates the covenant by replacing\n// those 26 bytes and requiring output 0 to be locked to the result. One\n// contract, one code hash per price tier; the state is in the address.\n//\n// Numbers must match Argus/src/lib/registry-lifecycle.js, which is the\n// reference: integer arithmetic, multiply before dividing.\n//\n// What script cannot do, stated once: it can prove a block height has been\n// REACHED (tx.time), never that one has NOT. So \"the owner may reclaim only\n// until the grace period ends\" is not enforceable; an owner can renew for as\n// long as nobody has taken the name over. The takeover price is safe against\n// this: a taker can only claim a height that is already past, and a later\n// height means a lower price they are entitled to anyway.\ncontract NameRegistry(\n // ---- fixed for this covenant version and price tier ----\n bytes fundLock, // locking bytecode the fund's payments must go to\n pubkey stewardPk, // approves the CODE of a newer covenant version (migrate)\n bytes commitBoxCode, // redeem-script body of the CommitBox contract\n int renewalSats, // price of one year, for the owner\n int premiumSats, // takeover price at the moment of expiry\n int floorSats, // takeover price once the grace period has run out\n int graceBlocks, // length of the grace period\n int blocksPerYear,\n int ownerPercentIdle, // previous owner's share of a takeover during grace\n // ---- state: keep these LAST, in this order ----\n bytes4 expiry, // block height the paid period ends at\n bytes20 ownerPkh\n) {\n // Keep the name: pay for `years` more. Also the reclaim path — an expired\n // name renews exactly the same way, from its old expiry.\n function renew(pubkey pk, sig s, int years) {\n require(hash160(pk) == ownerPkh);\n require(checkSig(s, pk));\n require(years >= 1);\n\n int newExpiry = int(expiry) + years * blocksPerYear;\n bytes newState = 0x14 + ownerPkh + 0x04 + toPaddedBytes(newExpiry, 4);\n bytes32 newHash = hash256(newState + this.activeBytecode.split(26)[1]);\n\n require(tx.outputs[0].lockingBytecode == new LockingBytecodeP2SH32(newHash));\n require(tx.outputs[0].tokenCategory == tx.inputs[this.activeInputIndex].tokenCategory);\n require(tx.outputs[0].nftCommitment == tx.inputs[this.activeInputIndex].nftCommitment);\n require(tx.outputs[0].value >= tx.inputs[this.activeInputIndex].value);\n\n require(tx.outputs[1].lockingBytecode == fundLock);\n require(tx.outputs[1].value >= renewalSats * years);\n require(tx.outputs[1].tokenCategory == 0x);\n }\n\n // Hand the name to another key (a sale, a gift), or re-create it for the\n // same key — which is how records are updated: the certificate has to move\n // for a resolver to accept an UPD. Expiry is untouched.\n function transfer(pubkey pk, sig s, bytes20 newOwnerPkh) {\n require(hash160(pk) == ownerPkh);\n require(checkSig(s, pk));\n\n bytes newState = 0x14 + newOwnerPkh + 0x04 + expiry;\n bytes32 newHash = hash256(newState + this.activeBytecode.split(26)[1]);\n\n require(tx.outputs[0].lockingBytecode == new LockingBytecodeP2SH32(newHash));\n require(tx.outputs[0].tokenCategory == tx.inputs[this.activeInputIndex].tokenCategory);\n require(tx.outputs[0].nftCommitment == tx.inputs[this.activeInputIndex].nftCommitment);\n require(tx.outputs[0].value >= tx.inputs[this.activeInputIndex].value);\n }\n\n // Take an expired name. No owner signature: anyone may, at a price that\n // glides from premiumSats at expiry down to floorSats at the end of the\n // grace period and stays there. During grace the previous owner is paid\n // ownerPercentIdle of the price; afterwards the fund receives all of it.\n //\n // Input 1 must be a CommitBox the taker created at least a block earlier,\n // committing to this name and to their own key. It hides which name is\n // wanted until the takeover itself, so the transaction cannot be copied\n // from the mempool by someone who had not already committed.\n function takeover(bytes20 newOwnerPkh, bytes salt) {\n int expiryHeight = int(expiry);\n require(tx.time >= expiryHeight);\n int height = tx.locktime;\n require(height < 500000000); // a block height, not a timestamp\n\n int idleEnd = expiryHeight + graceBlocks;\n int price = floorSats;\n int ownerSats = 0;\n if (height < idleEnd) {\n price = floorSats + (premiumSats - floorSats) * (idleEnd - height) / graceBlocks;\n ownerSats = price * ownerPercentIdle / 100;\n }\n\n // the commit\n bytes32 commitHash = hash256(tx.inputs[this.activeInputIndex].nftCommitment + salt);\n bytes boxRedeem = 0x14 + newOwnerPkh + 0x20 + commitHash + commitBoxCode;\n require(tx.inputs[1].lockingBytecode == new LockingBytecodeP2SH32(hash256(boxRedeem)));\n\n // the name, under its new owner, for one fresh year\n bytes newState = 0x14 + newOwnerPkh + 0x04 + toPaddedBytes(height + blocksPerYear, 4);\n bytes32 newHash = hash256(newState + this.activeBytecode.split(26)[1]);\n require(tx.outputs[0].lockingBytecode == new LockingBytecodeP2SH32(newHash));\n require(tx.outputs[0].tokenCategory == tx.inputs[this.activeInputIndex].tokenCategory);\n require(tx.outputs[0].nftCommitment == tx.inputs[this.activeInputIndex].nftCommitment);\n require(tx.outputs[0].value >= tx.inputs[this.activeInputIndex].value);\n\n // the money\n require(tx.outputs[1].lockingBytecode == fundLock);\n require(tx.outputs[1].value >= price - ownerSats);\n require(tx.outputs[1].tokenCategory == 0x);\n if (ownerSats > 0) {\n require(tx.outputs[2].lockingBytecode == new LockingBytecodeP2PKH(ownerPkh));\n require(tx.outputs[2].value >= ownerSats);\n require(tx.outputs[2].tokenCategory == 0x);\n }\n }\n\n // Give the name back: the certificate is destroyed. At most four outputs,\n // none of which may carry it — the owner cannot use this path to walk the\n // certificate out of the covenant into a plain wallet.\n function release(pubkey pk, sig s) {\n require(hash160(pk) == ownerPkh);\n require(checkSig(s, pk));\n\n bytes category = tx.inputs[this.activeInputIndex].tokenCategory;\n require(tx.outputs.length <= 4);\n require(tx.outputs[0].tokenCategory != category);\n if (tx.outputs.length > 1) { require(tx.outputs[1].tokenCategory != category); }\n if (tx.outputs.length > 2) { require(tx.outputs[2].tokenCategory != category); }\n if (tx.outputs.length > 3) { require(tx.outputs[3].tokenCategory != category); }\n }\n\n // Move to a newer covenant version. The owner chooses to; the steward has\n // signed the hash of the new version's CODE, once, for everyone. Neither\n // can act alone: the steward cannot move a name, and the owner cannot\n // migrate to a script the steward has not published. `newState` is whatever\n // the new version expects in front of its code.\n function migrate(pubkey pk, sig s, datasig approval, bytes newCode, bytes newState) {\n require(hash160(pk) == ownerPkh);\n require(checkSig(s, pk));\n require(checkDataSig(approval, hash256(newCode), stewardPk));\n\n bytes32 newHash = hash256(newState + newCode);\n require(tx.outputs[0].lockingBytecode == new LockingBytecodeP2SH32(newHash));\n require(tx.outputs[0].tokenCategory == tx.inputs[this.activeInputIndex].tokenCategory);\n require(tx.outputs[0].nftCommitment == tx.inputs[this.activeInputIndex].nftCommitment);\n require(tx.outputs[0].value >= tx.inputs[this.activeInputIndex].value);\n }\n}\n", "fingerprint": "bd756d3c667bfe0a857b74d48d9ccea9a69ea51ffb2bd9a6de0f12f919719453", "debug": { "bytecode": "5b79009c635c79a95b79885d7a5d7aad5c7951a269597a815c79597a959301145a7a7e547e7c54807ec1011a7f777eaa00cd02aa207b7e01877e8800d1c0ce8800d2c0cf8800ccc0c6a26951cd8851cc537a597a95a26951d100886d6d6d7551675b79519c635e7a820114885d79a95c7a885d7a5d7aad01147c7e547e5a7a7ec1011a7f777eaa00cd02aa207b7e01877e8800d1c0ce8800d2c0cf8800ccc0c6a2696d6d6d6d6d51675b79529c635c7a820114885a7a8176b175c576040065cd1d9f697c597993587900709f635a795a795c79945479567994955d7996937b757c785e79950164967768c0cf01117a7eaa011456797e01207e7c7e587a7e51c702aa207baa7e01877e880114557a7e547e547a5b7a9354807ec1011a7f777eaa00cd02aa207b7e01877e8800d1c0ce8800d2c0cf8800ccc0c6a26951cd547a8851cc7b527994a26951d100887600a06352cd0376a9145a797e0288ac7e8852cc78a26952d10088686d6d6d6d6d51675b79539c635c79a95b7a885c7a5c7aadc0cec454a16900d178879169c451a06351d17887916968c452a06352d17887916968c453a06353d178879169686d6d6d6d6d6d51675b7a549d5b79a95b7a885b7a5b7aad5a7a5b79aa537abb5a7a5a7a7eaa00cd02aa207b7e01877e8800d1c0ce8800d2c0cf8800ccc0c6a2696d6d6d6d755168686868", "sourceMap": "47:4:64:5;;;;;48:24:48:26;;:16::27:1;:31::39:0;;:8::41:1;49:25:49:26:0;;:28::30;;:8::33:1;50:16:50:21:0;;:25::26;:16:::1;:8::28;52:28:52:34:0;;:24::35:1;:38::43:0;;:46::59;;:38:::1;:24;53:25:53:29:0;:32::40;;:25:::1;:43::47:0;:25:::1;:64::73:0;:75::76;:50::77:1;:25;54:45:54:64:0;:71::73;:45::74:1;:::77;:34;:26::78;56:27:56:28:0;:16::45:1;:49::83:0;:75::82;:49::83:1;;;:8::85;57:27:57:28:0;:16::43:1;:57::78:0;:47::93:1;:8::95;58:27:58:28:0;:16::43:1;:57::78:0;:47::93:1;:8::95;59:27:59:28:0;:16::35:1;:49::70:0;:39::77:1;:16;:8::79;61:27:61:28:0;:16::45:1;:8::59;62:27:62:28:0;:16::35:1;:39::50:0;;:53::58;;:39:::1;:16;:8::60;63:27:63:28:0;:16::43:1;:47::49:0;:8::51:1;47:48:64:5;;;;;:4;69::80::0;;;;;:40:69:59;;;;;70:24:70:26;;:16::27:1;:31::39:0;;:8::41:1;71:25:71:26:0;;:28::30;;:8::33:1;73:25:73:29:0;:32::43;:25:::1;:46::50:0;:25:::1;:53::59:0;;:25:::1;74:45:74:64:0;:71::73;:45::74:1;:::77;:34;:26::78;76:27:76:28:0;:16::45:1;:49::83:0;:75::82;:49::83:1;;;:8::85;77:27:77:28:0;:16::43:1;:57::78:0;:47::93:1;:8::95;78:27:78:28:0;:16::43:1;:57::78:0;:47::93:1;:8::95;79:27:79:28:0;:16::35:1;:49::70:0;:39::77:1;:16;:8::79;69:61:80:5;;;;;;:4;91::127::0;;;;;:22:91:41;;;;;92:31:92:37;;:27::38:1;93::93:39:0;:8::41:1;;94:21:94:32:0;95:16:95:22;:25::34;:16:::1;:8::36;97:22:97:34:0;:37::48;;:22:::1;98:20:98:29:0;;99:24:99:25;100:12:100:28;::::1;:30:103:9:0;101:20:101:29;;:33::44;;:47::56;;:33:::1;:61::68:0;;:71::77;;:61:::1;:32::78;:81::92:0;;:32:::1;:20;:12::93;;;102:24:102:29:0;:32::48;;:24:::1;:51::54:0;:24:::1;:12::55;100:30:103:9;106:47:106:68:0;:37::83:1;:86::90:0;;:37:::1;:29::91;107:26:107:30:0;:33::44;;:26:::1;:47::51:0;:26:::1;:54::64:0;:26:::1;:67::80:0;;:26:::1;108::108:27:0;:16::44:1;:48::93:0;:82::91;:74::92:1;:48::93;;;:8::95;111:25:111:29:0;:32::43;;:25:::1;:46::50:0;:25:::1;:67::73:0;;:76::89;;:67:::1;:91::92:0;:53::93:1;:25;112:45:112:64:0;:71::73;:45::74:1;:::77;:34;:26::78;113:27:113:28:0;:16::45:1;:49::83:0;:75::82;:49::83:1;;;:8::85;114:27:114:28:0;:16::43:1;:57::78:0;:47::93:1;:8::95;115:27:115:28:0;:16::43:1;:57::78:0;:47::93:1;:8::95;116:27:116:28:0;:16::35:1;:49::70:0;:39::77:1;:16;:8::79;119:27:119:28:0;:16::45:1;:49::57:0;;:8::59:1;120:27:120:28:0;:16::35:1;:39::44:0;:47::56;;:39:::1;:16;:8::58;121:27:121:28:0;:16::43:1;:47::49:0;:8::51:1;122:12:122:21:0;:24::25;:12:::1;:27:126:9:0;123:31:123:32;:20::49:1;:53::87:0;:78::86;;:53::87:1;;;:12::89;124:31:124:32:0;:20::39:1;:43::52:0;:20:::1;:12::54;125:31:125:32:0;:20::47:1;:51::53:0;:12::55:1;122:27:126:9;91:55:127:5;;;;;;:4;132::142::0;;;;;133:24:133:26;;:16::27:1;:31::39:0;;:8::41:1;134:25:134:26:0;;:28::30;;:8::33:1;136:35:136:56:0;:25::71:1;137:16:137:33:0;:37::38;:16:::1;:8::40;138:27:138:28:0;:16::43:1;:47::55:0;:16:::1;;:8::57;139:12:139:29:0;:32::33;:12:::1;:35::88:0;:56::57;:45::72:1;:76::84:0;:45:::1;;:37::86;:35::88;140:12:140:29:0;:32::33;:12:::1;:35::88:0;:56::57;:45::72:1;:76::84:0;:45:::1;;:37::86;:35::88;141:12:141:29:0;:32::33;:12:::1;:35::88:0;:56::57;:45::72:1;:76::84:0;:45:::1;;:37::86;:35::88;132:39:142:5;;;;;;;:4;149::159::0;;;;150:24:150:26;;:16::27:1;:31::39:0;;:8::41:1;151:25:151:26:0;;:28::30;;:8::33:1;152:29:152:37:0;;:47::54;;:39::55:1;:57::66:0;;:8::69:1;154:34:154:42:0;;:45::52;;:34:::1;:26::53;155:27:155:28:0;:16::45:1;:49::83:0;:75::82;:49::83:1;;;:8::85;156:27:156:28:0;:16::43:1;:57::78:0;:47::93:1;:8::95;157:27:157:28:0;:16::43:1;:57::78:0;:47::93:1;:8::95;158:27:158:28:0;:16::35:1;:49::70:0;:39::77:1;:16;:8::79;149:88:159:5;;;;;;30:0:160:1;;;", "logs": [], "requires": [ { "ip": 21, "line": 48 }, { "ip": 26, "line": 49 }, { "ip": 31, "line": 50 }, { "ip": 64, "line": 56 }, { "ip": 69, "line": 57 }, { "ip": 74, "line": 58 }, { "ip": 80, "line": 59 }, { "ip": 83, "line": 61 }, { "ip": 92, "line": 62 }, { "ip": 96, "line": 63 }, { "ip": 118, "line": 70 }, { "ip": 123, "line": 71 }, { "ip": 145, "line": 76 }, { "ip": 150, "line": 77 }, { "ip": 155, "line": 78 }, { "ip": 161, "line": 79 }, { "ip": 183, "line": 93 }, { "ip": 189, "line": 95 }, { "ip": 253, "line": 108 }, { "ip": 281, "line": 113 }, { "ip": 286, "line": 114 }, { "ip": 291, "line": 115 }, { "ip": 297, "line": 116 }, { "ip": 302, "line": 119 }, { "ip": 310, "line": 120 }, { "ip": 314, "line": 121 }, { "ip": 327, "line": 123 }, { "ip": 332, "line": 124 }, { "ip": 336, "line": 125 }, { "ip": 355, "line": 133 }, { "ip": 360, "line": 134 }, { "ip": 366, "line": 137 }, { "ip": 372, "line": 138 }, { "ip": 382, "line": 139 }, { "ip": 393, "line": 140 }, { "ip": 404, "line": 141 }, { "ip": 423, "line": 150 }, { "ip": 428, "line": 151 }, { "ip": 436, "line": 152 }, { "ip": 450, "line": 155 }, { "ip": 455, "line": 156 }, { "ip": 460, "line": 157 }, { "ip": 466, "line": 158 } ], "sourceTags": "97:101:pv;163:167:pv" }, "compiler": { "name": "cashc", "version": "0.13.3", "options": { "enforceFunctionParameterTypes": true, "enforceLocktimeGuard": true } }, "updatedAt": "2026-10-04T13:36:52.297Z" }