Skip to content

Commit

Permalink
Merge pull request #87 from MeshJS/dandelion
Browse files Browse the repository at this point in the history
Dandelion Support
  • Loading branch information
abdelkrimdev authored Jan 25, 2023
2 parents 433e97f + 492bebd commit f4b806e
Show file tree
Hide file tree
Showing 44 changed files with 1,374 additions and 68 deletions.
2 changes: 1 addition & 1 deletion packages/cli/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"description": "A quick and easy way to bootstrap your dApps on Cardano using Mesh.",
"homepage": "https://meshjs.dev",
"author": "MeshJS",
"version": "1.0.4",
"version": "1.0.5",
"license": "Apache-2.0",
"main": "dist/create-mesh-app.cjs.js",
"bin": {
Expand Down
2 changes: 1 addition & 1 deletion packages/cli/src/actions/create.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ export const create = async (name, options) => {
{ title: 'Starter Project', value: 'starter' },
{ title: 'Multi-Sig Minting', value: 'minting' },
{ title: 'Stake-Pool Website', value: 'staking' },
{ title: 'Smart-Contract Marketplace <COMING-SOON>', value: 'marketplace' },
{ title: 'Cardano Sign-In', value: 'signin' },
]));

const stack =
Expand Down
2 changes: 1 addition & 1 deletion packages/cli/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ const main = async () => {
createOption(
'-t, --template <TEMPLATE-NAME>',
`The template to start your project from.`
).choices(['starter', 'minting', 'staking', 'marketplace'])
).choices(['starter', 'minting', 'staking', 'marketplace', 'signin'])
)
.addOption(
createOption(
Expand Down
2 changes: 1 addition & 1 deletion packages/demo/components/common/blockchainProvider.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ export default function BlockchainProviderCodeSnippet() {
codeBF += `const blockchainProvider = new BlockfrostProvider('<BLOCKFROST_API_KEY>');`;

let codeKoios = `import { KoiosProvider } from '@meshsdk/core';\n\n`;
codeKoios += `const blockchainProvider = new KoiosProvider('<api,preprod,preview>');`;
codeKoios += `const blockchainProvider = new KoiosProvider('<'api'|'preview'|'preprod'|'guild'>');`;

let codeTango = `import { TangoProvider } from '@meshsdk/core';\n\n`;
codeTango += `const blockchainProvider = new TangoProvider(\n`;
Expand Down
16 changes: 16 additions & 0 deletions packages/demo/components/pages/providers/badges.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,19 @@ export function BadgeSubmitter() {
</span>
);
}

export function BadgeEvaluator() {
return (
<span className="bg-blue-100 text-blue-800 text-xs font-semibold mr-2 px-2.5 py-0.5 rounded dark:bg-blue-200 dark:text-blue-900">
Evaluator
</span>
);
}

export function BadgeListener() {
return (
<span className="bg-orange-100 text-orange-800 text-xs font-semibold mr-2 px-2.5 py-0.5 rounded dark:bg-orange-200 dark:text-orange-900">
Listener
</span>
);
}
42 changes: 42 additions & 0 deletions packages/demo/components/pages/providers/evaluator.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
import { useEffect, useState } from 'react';
import SectionTwoCol from '../../common/sectionTwoCol';
import { demoAddresses } from '../../../configs/demo';
import { BadgeEvaluator } from './badges';
import { evaluateTxLeft, evaluateTxRight } from './evaluator/evaluateTx';
import { useWallet } from '@meshsdk/react';

export default function Evaluator({ evaluator, evaluatorName }) {
const { wallet, connected } = useWallet();
const [address, setAddress] = useState<string>(demoAddresses.testnet);
// const [lovelace, setLovelace] = useState<string>('5000000');

useEffect(() => {
async function init() {
setAddress(
(await wallet.getNetworkId()) === 1
? demoAddresses.mainnet
: demoAddresses.testnet
);
}
if (connected) {
init();
}
}, [connected]);

return (
<>
<SectionTwoCol
sidebarTo="evaluateTx"
header="evaluateTx"
leftFn={evaluateTxLeft({
evaluatorName,
})}
rightFn={evaluateTxRight({
evaluator,
})}
isH3={true}
badge={<BadgeEvaluator />}
/>
</>
);
}
143 changes: 143 additions & 0 deletions packages/demo/components/pages/providers/evaluator/evaluateTx.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,143 @@
import { useState } from 'react';
import RunDemoButton from '../../../common/runDemoButton';
import RunDemoResult from '../../../common/runDemoResult';
import Card from '../../../ui/card';
import Codeblock from '../../../ui/codeblock';
import { Transaction, KoiosProvider, resolveDataHash } from '@meshsdk/core';
import { useWallet, CardanoWallet } from '@meshsdk/react';

export function evaluateTxLeft({ evaluatorName }) {
let code1 = ``;
code1 += `const unsignedTx = await tx.build();\n`;
code1 += `const evaluateTx = await ${evaluatorName}.evaluateTx(unsignedTx);\n`;

let demoResults = ``;
demoResults += `[\n`;
demoResults += ` {\n`;
demoResults += ` "index": 0,\n`;
demoResults += ` "tag": "SPEND",\n`;
demoResults += ` "budget": {\n`;
demoResults += ` "mem": 1700,\n`;
demoResults += ` "steps": 368100\n`;
demoResults += ` }\n`;
demoResults += ` }\n`;
demoResults += `]\n`;

let codeRedeemer = ``;
codeRedeemer += `const redeemer = {\n`;
codeRedeemer += ` data: { alternative: 0, fields: [...] },\n`;
codeRedeemer += ` budget: {\n`;
codeRedeemer += ` mem: 1700,\n`;
codeRedeemer += ` steps: 368100,\n`;
codeRedeemer += ` },\n`;
codeRedeemer += `};\n`;

return (
<>
<p>
<code>evaluateTx()</code> accepts an unsigned transaction (
<code>unsignedTx</code>) and it evaluates the resources required to
execute the transaction. Note that, this is only valid for transaction
interacting with redeemer (smart contract). By knowing the budget
required, you can use this to adjust the redeemer's budget so you don't
spend more than you need to execute transactions for this smart
contract.
</p>
<Codeblock data={code1} isJson={false} />
<p>
Example responses from unlocking assets from the always succeed smart
contract.
</p>
<Codeblock data={demoResults} isJson={false} />
<p>
With the <code>mem</code> and <code>steps</code>, you can refine the
budget for the redeemer. For example:
</p>
<Codeblock data={codeRedeemer} isJson={false} />
</>
);
}

export function evaluateTxRight({ evaluator }) {
const { wallet, connected } = useWallet();
const [loading, setLoading] = useState<boolean>(false);
const [response, setResponse] = useState<null | any>(null);
const [responseError, setResponseError] = useState<null | any>(null);

async function _getAssetUtxo({ scriptAddress, asset, datum }) {
const koios = new KoiosProvider('preprod');

const utxos = await koios.fetchAddressUTxOs(scriptAddress, asset);

const dataHash = resolveDataHash(datum);

let utxo = utxos.find((utxo: any) => {
return utxo.output.dataHash == dataHash;
});

return utxo;
}

async function runDemo() {
setLoading(true);
setResponse(null);
setResponseError(null);

try {
const assetUtxo = await _getAssetUtxo({
scriptAddress:
'addr_test1wpnlxv2xv9a9ucvnvzqakwepzl9ltx7jzgm53av2e9ncv4sysemm8',
asset:
'64af286e2ad0df4de2e7de15f8ff5b3d27faecf4ab2757056d860a424d657368546f6b656e',
datum: 'supersecretmeshdemo',
});

const address = await wallet.getChangeAddress();

const tx = new Transaction({ initiator: wallet })
.redeemValue({
value: assetUtxo,
script: {
version: 'V1',
code: '4e4d01000033222220051200120011',
},
datum: 'supersecretmeshdemo',
})
.sendValue(address, assetUtxo)
.setRequiredSigners([address]);

const unsignedTx = await tx.build();
const evaluateTx = await evaluator.evaluateTx(unsignedTx);

setResponse(evaluateTx);
} catch (error) {
setResponseError(`${error}`);
}
setLoading(false);
}

return (
<>
<Card>
<p>
Unlock an asset from the always succeed to check how much it takes to
execute this transaction.
</p>
{connected ? (
<>
<RunDemoButton
runDemoFn={runDemo}
loading={loading}
response={response}
/>
</>
) : (
<CardanoWallet />
)}

<RunDemoResult response={response} label="Response evaluateTx" />
<RunDemoResult response={responseError} label="Error" />
</Card>
</>
);
}
84 changes: 73 additions & 11 deletions packages/demo/components/pages/providers/fetcher.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { useState } from 'react';
import { useEffect, useState } from 'react';
import SectionTwoCol from '../../common/sectionTwoCol';
import { demoAddresses } from '../../../configs/demo';
import { BadgeFetcher } from './badges';
Expand Down Expand Up @@ -26,8 +26,16 @@ import {
fetchHandleAddressLeft,
fetchHandleAddressRight,
} from './fetchers/fetchHandleAddress';
import { useWallet } from '@meshsdk/react';
import { fetchTxInfoLeft, fetchTxInfoRight } from './fetchers/fetchTxInfo';
import {
fetchBlockInfoLeft,
fetchBlockInfoRight,
} from './fetchers/fetchBlockInfo';

export default function Fetcher({ fetcher, fetcherName }) {
const { wallet, connected } = useWallet();

const [fetchAddressUtxosAddress, setfetchAddressUtxosAddress] =
useState<string>(demoAddresses.testnet);
const [fetchAddressUtxosAsset, setfetchAddressUtxosAsset] = useState<string>(
Expand All @@ -51,6 +59,26 @@ export default function Fetcher({ fetcher, fetcherName }) {
const [fetchHandleAddressHandle, setfetchHandleAddressHandle] =
useState<string>('jingles');

const [txHash, setTxHash] = useState<string>(
'f4ec9833a3bf95403d395f699bc564938f3419537e7fb5084425d3838a4b6159'
);
const [block, setBlock] = useState<string>(
'79f60880b097ec7dabb81f75f0b52fedf5e922d4f779a11c0c432dcf22c56089'
);

// useEffect(() => {
// async function init() {
// setTxHash(
// (await wallet.getNetworkId()) === 1
// ? '84a1d1a9f8fb3e7b4f3d1bb04ece750fe2697e74b7916804c2f179870eb34f17'
// : 'f4ec9833a3bf95403d395f699bc564938f3419537e7fb5084425d3838a4b6159'
// );
// }
// if (connected) {
// init();
// }
// }, [connected]);

return (
<>
<SectionTwoCol
Expand All @@ -68,6 +96,26 @@ export default function Fetcher({ fetcher, fetcherName }) {
isH3={true}
badge={<BadgeFetcher />}
/>

<SectionTwoCol
sidebarTo="fetchAddressUtxos"
header="fetchAddressUtxos"
leftFn={fetchAddressUtxosLeft({
fetcherName,
fetchAddressUtxosAddress,
fetchAddressUtxosAsset,
})}
rightFn={fetchAddressUtxosRight({
fetcher,
fetchAddressUtxosAddress,
setfetchAddressUtxosAddress,
fetchAddressUtxosAsset,
setfetchAddressUtxosAsset,
})}
isH3={true}
badge={<BadgeFetcher />}
/>

<SectionTwoCol
sidebarTo="fetchAssetAddresses"
header="fetchAssetAddresses"
Expand Down Expand Up @@ -99,24 +147,23 @@ export default function Fetcher({ fetcher, fetcherName }) {
isH3={true}
badge={<BadgeFetcher />}
/>

<SectionTwoCol
sidebarTo="fetchAddressUtxos"
header="fetchAddressUtxos"
leftFn={fetchAddressUtxosLeft({
sidebarTo="fetchBlockInfo"
header="fetchBlockInfo"
leftFn={fetchBlockInfoLeft({
fetcherName,
fetchAddressUtxosAddress,
fetchAddressUtxosAsset,
block,
})}
rightFn={fetchAddressUtxosRight({
rightFn={fetchBlockInfoRight({
fetcher,
fetchAddressUtxosAddress,
setfetchAddressUtxosAddress,
fetchAddressUtxosAsset,
setfetchAddressUtxosAsset,
block,
setBlock,
})}
isH3={true}
badge={<BadgeFetcher />}
/>

<SectionTwoCol
sidebarTo="fetchHandleAddress"
header="fetchHandleAddress"
Expand Down Expand Up @@ -147,6 +194,21 @@ export default function Fetcher({ fetcher, fetcherName }) {
isH3={true}
badge={<BadgeFetcher />}
/>
<SectionTwoCol
sidebarTo="fetchTxInfo"
header="fetchTxInfo"
leftFn={fetchTxInfoLeft({
fetcherName,
txHash,
})}
rightFn={fetchTxInfoRight({
fetcher,
txHash,
setTxHash,
})}
isH3={true}
badge={<BadgeFetcher />}
/>
</>
);
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ export function fetchAccountInfoLeft({ fetcherName, fetchAccountInfoAddress }) {
</>
);
}

export function fetchAccountInfoRight({
fetcher,
fetchAccountInfoAddress,
Expand Down
Loading

1 comment on commit f4b806e

@vercel
Copy link

@vercel vercel bot commented on f4b806e Jan 25, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please sign in to comment.