Skip to content

Commit

Permalink
feat: it works on preview
Browse files Browse the repository at this point in the history
Co-authored-by: Lucas Rosa <[email protected]>
  • Loading branch information
MicroProofs and rvcas committed Aug 25, 2023
1 parent d6df900 commit e830c33
Show file tree
Hide file tree
Showing 5 changed files with 90 additions and 43 deletions.
2 changes: 2 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
KUPO_URL=""
OGMIOS_URL=""
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,5 @@ docs/

/target

seed.txt
seed.txt
.env
4 changes: 4 additions & 0 deletions deno.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

11 changes: 11 additions & 0 deletions genesis/preview.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"validator": "590f82590f7f0100003323232323232323232323222253330083370e9000180380089929998049919299980599b87480080084c8c8c8c94ccc03ccdc3a4000601c0022646464646464646464646464646464646464646464646464646464a66605466e1d2002302900313232533302c3370e900118158048991929998172999817199817002a504a22a66605c012266e24cdc0801800a4181f82a294052809929998179981280e919baf3302c302e001480000ac4c8c8c94ccc0d4c0e00084c8c8c8c8c94ccc0dccdc3a4008606c00226464a6660726464a66607c608200426464a66607a66e3c009221096c6f72642074756e610013370e00290010a50375a607c0046eb8c0f000458c0fc004c8c94ccc0eccdc3a4004002297adef6c601323756608200260720046072002646600200203a44a66607c0022980103d87a8000132323232533303f3371e05e004266e95200033043374c00297ae0133006006003375660800066eb8c0f8008c108008c10000454ccc0e4c8c8c94ccc0fcc1080084c8c8c8c94ccc100cdc7802245001325333044304700213232533304353330433371e00a066266e1c005200214a0266e3c009221096c6f72642074756e610014a06eb4c110008dd718210008b182280089929998221823802099192999821a99982199b8f00703313370e00290010a5013371e004911096c6f72642074756e610014a06eb4c110008dd718210008b18228019bab3041004375c607e0066eacc0fc010dd7181e8018b18200009820003181f0028991919baf0010033374a90001981f26010100003303e37520166607c9810104003303e4c10319ffff003303e4c10100003303e37500186607c9810100003303e4c10180004bd7019299981d19b87480000044c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c94ccc134c140008526163758609c002609c004609800260980046eb4c128004c128008dd6982400098240011bad30460013046002375a608800260880046eb8c108004c108008dd69820000981c0010b181c0008b0b181e800981a8008b181d800981d8011bab303900130390013030001163036001323300100101c22533303500114bd7009919299981a19baf3303030323303030320024800120003374a90011981c1ba90244bd7009981c00119802002000899802002000981c801181b8009919191801000980080111b9200137660542c66e00cdc199b810030014801000458dd6981900098150048b1bad30300013028003163370e900118151baa302e001302e002302c00130240053370e900118131baa302a001302a00230280013020003302600130260023024001301c002323300100100622533302200114bd6f7b630099191919299981199b8f489000021003133027337606ea4008dd3000998030030019bab3024003375c6044004604c0046048002604200260420026040002603e0046eacc074004c074004c070008dd6180d000980d000980c8011bac3017001300f005375c602a002601a0022c6026002602600460220026012008264646464a66601e66e1d2000300e00113232323300837586601c602000c9000119baf3300f30113300f30113300f301100148009200048000008cdd2a40046602a6ea40052f5c06eb8c054004c03400458c04c004c04c008c044004c02401088c8cc00400400c894ccc04400452809919299980818028010a51133004004001301500230130013008003149858c94ccc024cdc3a40000022a666018600e0062930b0a99980499b874800800454ccc030c01c00c5261616300700213223232533300c32323232323232323232323232323232323232533301f3370e9001180f0008991919191919191919191919191919191919191919299981a19b8748008c0cc0044c8c8c8c94ccc0ecc0f80084c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c94ccc124cdc3a4004609000626464a66609666e1d2002304a0091323232533304e533304e33304e0064a094454ccc1380284cdc499b8100400248303f0545280a50132323232325333053533305333710084002294454ccc14ccdc3800821099b8800204014a0264a6660a866e1cc8c8c94ccc15ccdc3a4004002290000991bad305d001305500230550013253330563370e90010008a6103d87a800013232323300100100222533305d00114c103d87a8000132323232533305e3371e911096c6f72642074756e610000213374a9000198311ba80014bd700998030030019bad305f003375c60ba00460c200460be0026eacc170004c150008c150004cc00408807d2002132325333059305c002132323232533305a533305a3371e00891010454554e410013370e006002294054ccc168c8c8c94ccc180c18c0084c8c8c8c94ccc184cdc7802245001325333065306800213232533306453330643371e00a05e266e1c005200214a0266e3c009221096c6f72642074756e610014a06eb4c194008dd718318008b183300089929998329834002099192999832299983219b8f00702f13370e00290010a5013371e004911096c6f72642074756e610014a06eb4c194008dd718318008b18330019bab3062004375c60c00066eacc180010dd7182f0018b18308009830810982f8100a99982d19b8748010c1640784c8c94ccc170cdc3a400060b6002264646464646464646464646464646464a6660de60e4004264a6660daa6660daa6660da66e1ccdc3030241803e9000099b8848000180528099191919191919299983a19b87001013153330743370e004022266e1d200000f14a02940dd6983a8011bad3073001333300505e060002001375a60e40046eb4c1c00054ccc1b94ccc1b8cdc4a401066e0d2080d49301001133710900019b8648203524c040045280a5ef6c601010100010104001533306e533306e33712900419b8300148203524c044cdc42400066e180052080d4930114a0297bdb181010400010101001337606ea0005301051a00127500003370266e001600801584c94ccc1b8cdc382e8068a99983719b8705b00b13370e002012294052819b81337000b00400ac2a6660da66e1c01808054ccc1b54ccc1b4cdc399b80060480080404cdc780700f0a501533306d337126e34dd98022410010266ebcdd3999999111119199980080082c8018011111191919299983ca99983c99b8800100b14a22a6660f266e1c02c0044cdc40050010a501533307c00613307d00c3307d00c33330070074bd70001000899299983e80089983f0069983f006999980400425eb8000c0084c8cc1fc038cc1fc038cccc02402400401000cc20004004c1fc0184c8cccc00400401c0180148888c8c8c94ccc200054ccc20004cdc40008090a5115333080013370e024002266e200440085280a99984180803099842008099999803803a5eb800080044c8cc21404050cccc02002000400c008c218040184018dd69840808011bad307f0013333011002001480092004375a60f40046eb4c1e0004cccc028008005200248020dd480f00d80e02d02e1ba7002161616162222323253330723370e66e0c009208080084800054ccc1c8cdc4a407800a297bdb18103191000000102183c001337606ea0008dd419b800054800854ccc1c8cdc42400066e0c00520808008153330723371200a90020a5ef6c6010319ffff00010102001337606ea0cdc1800a40406ea0cdc0802a4004266ec0dd40009ba800533706002901019b833370466e08011202000200116375860e000260e000460dc00260dc0046eb4c1b0004c1b0008dd6983500098350011bad30680013068002375a60cc00260cc0046eb8c190004c190008dd69831000982d0008b1830000982c00f0b0b0b299982c99b88480e80045200013370690406457d0129991919180080091299982e99b89480280044cdc1240806600400466e04005200a13003001300100122533305b3371200290000a4004266e08cc008008cdc0800a4004900200099b8304b482834464dd6982c8011bae305700116305a001323253330563370e90010008a5eb7bdb1804c8dd5982e000982a001182a0009980081380f8b11191980080080191299982d0008a6103d87a8000132323232533305b3371e00e004266e9520003305f374c00297ae0133006006003375660b80066eb8c168008c178008c17000458dd6982a0011bad3052001323253330523370e66e180092004480004c8cdd81ba8001375000666e00cdc119b8e0030014820010cdc700199b80001480084c8cdd81ba8001375000666e00cdc019b823371c00600290402019b823371c00666e00005200248080cdc199b8e0033370000290022404066e0c005200432330010014800088c94ccc14ccdc3800a4000266e012004330030033370000490010a99982999b880014808052002148000cdc70018009919191801000980080111b92001376600266e952000330523752086660a46ea0104cc148dd481f998291ba803d330523750076660a46ea00e52f5c02c66e00cdc199b8100300148010004dd6982880098248048b1bad304f0013047003163370e900118249baa304d001304d002304b00130430053370e900118229baa304900130490023047001303f003304500130450023043001303b011304100130410023756607e002607e002606c0022c6078002646600200202444a666076002297ae013232533303a3375e6606c6070004900000509981f00119802002000899802002000981f801181e8009bae303a0013032001163302f303100348000dd5981b800981b801181a800981680099299981799b8748000c0b80044c8c8cc0b4c0bc00520023035001302d00116323300100100d22533303300114c0103d87a80001323253330323375e6605c60600049000009099ba548000cc0d80092f5c0266008008002606e004606a002646600200200c44a666064002297adef6c6013232323253330333371e911000021003133037337606ea4008dd3000998030030019bab3034003375c6064004606c0046068002606200260620026060002605e0046eacc0b4004c0b4004c0b0008dd61815000981500098148011bac3027001301f0053025001301d0011630230013023002302100130190123758603e002603e002603c0046eb4c070004c070008dd6980d000980d0011bad30180013018002375a602c002602c0046eb8c050004c050008dd6980900098050030a4c2c6eb800cc94ccc02ccdc3a4000002264646464646464646464646464646464a66603c60420042930b1bac301f001301f002301d001301d002375a603600260360046eb4c064004c064008dd6980b800980b8011bad30150013015002375c602600260260046eb4c044004c02401458c024010c034c018004cc0040052000222233330073370e0020060184666600a00a66e000112002300e001002002230053754002460066ea80055cd2ab9d5573caae7d5d02ba157449812bd8799fd8799f58200e1972174c6f0c9a57bb73f82ef2e490071aee921723c571ef507299e255403eff01ff0001",
"validatorHash": "e9e32598376a7df76137af0421bc0da65875fb9be35cf05b033df3ee",
"validatorAddress": "addr_test1wr57xfvcxa48mampx7hsggdupkn9sa0mn034euzmqv7l8mskxnvaw",
"boostrapHash": "c6d8fb316250e0006c8f592286871dfccfac49007250f153c90b653a8ed5dc94",
"datum": "d8799f005820c6d8fb316250e0006c8f592286871dfccfac49007250f153c90b653a8ed5dc940419ffff001b0000018a2e867f680080ff",
"outRef": {
"txHash": "0e1972174c6f0c9a57bb73f82ef2e490071aee921723c571ef507299e255403e",
"index": 1
}
}
113 changes: 71 additions & 42 deletions miner/main.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import "https://deno.land/[email protected]/dotenv/load.ts";
import { Command } from "https://deno.land/x/[email protected]/command/mod.ts";
import {
applyParamsToScript,
Expand All @@ -6,6 +7,7 @@ import {
fromHex,
fromText,
generateSeedPhrase,
Kupmios,
Lucid,
Script,
sha256,
Expand All @@ -21,7 +23,7 @@ import {
// Excludes datum field because it is not needed
// and it's annoying to type.
type Genesis = {
validator: Script;
validator: string;
validatorHash: string;
validatorAddress: string;
boostrapHash: string;
Expand All @@ -30,10 +32,12 @@ type Genesis = {

const mine = new Command()
.description("Start the miner")
.option("-p, --preprod", "Use testnet")
.action(async ({ preprod }) => {
.env("KUPO_URL=<value:string>", "Kupo URL")
.env("OGMIOS_URL=<value:string>", "Ogmios URL")
.option("-p, --preview", "Use testnet")
.action(async ({ preview, ogmiosUrl, kupoUrl }) => {
const genesisFile = Deno.readTextFileSync(
`genesis/${preprod ? "preprod" : "mainnet"}.json`,
`genesis/${preview ? "preview" : "mainnet"}.json`,
);

const {
Expand All @@ -42,7 +46,8 @@ const mine = new Command()
validatorAddress,
}: Genesis = JSON.parse(genesisFile);

const lucid = await Lucid.new(undefined, preprod ? "Preprod" : "Mainnet");
const provider = new Kupmios(kupoUrl ?? "", ogmiosUrl ?? "");
const lucid = await Lucid.new(provider, preview ? "Preview" : "Mainnet");

lucid.selectWalletFromSeed(Deno.readTextFileSync("seed.txt"));

Expand All @@ -58,10 +63,6 @@ const mine = new Command()
string | bigint | string[]
>;

state.fields;

state;

const nonce = new Uint8Array(16);

const targetState = new Constr(0, [
Expand Down Expand Up @@ -106,7 +107,7 @@ const mine = new Command()
targetState.fields[0] = toHex(nonce);
}

const realTimeNow = Date.now();
const realTimeNow = Number((Date.now() / 1000).toFixed(0)) * 1000 - 60000;

const interlink = calculateInterlink(toHex(targetHash), difficulty, {
leadingZeros: state.fields[2] as bigint,
Expand Down Expand Up @@ -136,7 +137,7 @@ const mine = new Command()
.collectFrom([validatorOutRef], Data.to(new Constr(1, [toHex(nonce)])))
.payToAddressWithData(validatorAddress, { inline: outDat }, masterToken)
.mintAssets(mintTokens, Data.to(new Constr(0, [])))
.attachMintingPolicy(validator)
.attachSpendingValidator({ type: "PlutusV2", script: validator })
.validTo(realTimeNow + 90000)
.validFrom(realTimeNow)
.complete();
Expand All @@ -152,17 +153,27 @@ const mine = new Command()
});

const genesis = new Command()
.description("Create block 0 using an ideally random out ref")
.arguments("<tx-hash:string> <index:number>")
.option("-p, --preprod", "Use testnet")
.action(async ({ preprod }, txHash, index) => {
.description("Create block 0")
.env("KUPO_URL=<value:string>", "Kupo URL")
.env("OGMIOS_URL=<value:string>", "Ogmios URL")
.option("-p, --preview", "Use testnet")
.action(async ({ preview, ogmiosUrl, kupoUrl }) => {
const unAppliedValidator = readValidator();

const lucid = await Lucid.new(undefined, preprod ? "Preprod" : "Mainnet");

const provider = new Kupmios(kupoUrl ?? "", ogmiosUrl ?? "");
const lucid = await Lucid.new(provider, preview ? "Preview" : "Mainnet");
lucid.selectWalletFromSeed(Deno.readTextFileSync("seed.txt"));

const initOutputRef = new Constr(0, [new Constr(0, [txHash]), index]);
const utxos = await lucid.wallet.getUtxos();

if (utxos.length === 0) {
throw new Error("No UTXOs Found");
}

const initOutputRef = new Constr(0, [
new Constr(0, [utxos[0].txHash]),
BigInt(utxos[0].outputIndex),
]);

const appliedValidator = applyParamsToScript(unAppliedValidator.script, [
initOutputRef,
Expand All @@ -175,7 +186,13 @@ const genesis = new Command()

const boostrapHash = toHex(sha256(sha256(fromHex(Data.to(initOutputRef)))));

const timeNow = Date.now();
const validatorAddress = lucid.utils.validatorToAddress(validator);

const validatorHash = lucid.utils.validatorToScriptHash(validator);

const masterToken = { [validatorHash + fromText("lord tuna")]: 1n };

const timeNow = Number((Date.now() / 1000).toFixed(0)) * 1000 - 60000;

// State
const preDatum = new Constr(0, [
Expand All @@ -199,15 +216,9 @@ const genesis = new Command()

const datum = Data.to(preDatum);

const validatorAddress = lucid.utils.validatorToAddress(validator);

const validatorHash = lucid.utils.validatorToScriptHash(validator);

const masterToken = { [validatorHash + fromText("lord tuna")]: 1n };

const tx = await lucid
.newTx()
.collectFrom([])
.collectFrom(utxos)
.payToContract(validatorAddress, { inline: datum }, masterToken)
.mintAssets(masterToken, Data.to(new Constr(1, [])))
.attachMintingPolicy(validator)
Expand All @@ -217,21 +228,29 @@ const genesis = new Command()

const signed = await tx.sign().complete();

await signed.submit();
try {
await signed.submit();

await lucid.awaitTx(signed.toHash());
console.log(`TX Hash: ${signed.toHash()}`);

Deno.writeTextFileSync(
`genesis/${preprod ? "preprod" : "mainnet"}.json`,
JSON.stringify({
validator: validator.script,
validatorHash,
validatorAddress,
boostrapHash,
datum: JSON.parse(Data.toJson(preDatum)),
outRef: { txHash, index },
}),
);
await lucid.awaitTx(signed.toHash());

console.log(`Completed and saving genesis file.`);

Deno.writeTextFileSync(
`genesis/${preview ? "preview" : "mainnet"}.json`,
JSON.stringify({
validator: validator.script,
validatorHash,
validatorAddress,
boostrapHash,
datum,
outRef: { txHash: utxos[0].txHash, index: utxos[0].outputIndex },
}),
);
} catch (e) {
console.log(e);
}
});

const init = new Command()
Expand All @@ -246,15 +265,25 @@ const init = new Command()

const address = new Command()
.description("Check address balance")
.option("-p, --preprod", "Use testnet")
.action(async ({ preprod }) => {
const lucid = await Lucid.new(undefined, preprod ? "Preprod" : "Mainnet");
.env("KUPO_URL=<value:string>", "Kupo URL")
.env("OGMIOS_URL=<value:string>", "Ogmios URL")
.option("-p, --preview", "Use testnet")
.action(async ({ preview, ogmiosUrl, kupoUrl }) => {
const provider = new Kupmios(kupoUrl ?? "", ogmiosUrl ?? "");
const lucid = await Lucid.new(provider, preview ? "Preview" : "Mainnet");

lucid.selectWalletFromSeed(Deno.readTextFileSync("seed.txt"));

const address = await lucid.wallet.address();

const utxos = await lucid.wallet.getUtxos();

const balance = utxos.reduce((acc, u) => {
return acc + u.assets.lovelace;
}, 0n);

console.log(`Address: ${address}`);
console.log(`ADA Balance: ${balance / 1_000_000n}`);
});

await new Command()
Expand Down

0 comments on commit e830c33

Please sign in to comment.