Merge branch 'dev' into 'rinderknecht-dev'
# Conflicts: # src/passes/1-parser/pascaligo/AST.ml # src/passes/1-parser/pascaligo/AST.mli # src/passes/1-parser/pascaligo/ParToken.mly
1
.gitignore
vendored
@ -6,3 +6,4 @@ cache/*
|
||||
Version.ml
|
||||
/_opam/
|
||||
/*.pp.ligo
|
||||
**/.DS_Store
|
2
gitlab-pages/.gitignore
vendored
@ -1,4 +1,4 @@
|
||||
.DS_Store
|
||||
**/.DS_Store
|
||||
|
||||
node_modules
|
||||
|
||||
|
5373
gitlab-pages/website/package-lock.json
generated
@ -11,6 +11,6 @@
|
||||
"rename-version": "docusaurus-rename-version"
|
||||
},
|
||||
"devDependencies": {
|
||||
"docusaurus": "^1.9.0"
|
||||
"docusaurus": "^1.13.0"
|
||||
}
|
||||
}
|
||||
|
@ -5,116 +5,167 @@
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
const React = require('react');
|
||||
const React = require("react");
|
||||
|
||||
const CompLibrary = require('../../core/CompLibrary.js');
|
||||
const CompLibrary = require("../../core/CompLibrary.js");
|
||||
|
||||
const MarkdownBlock = CompLibrary.MarkdownBlock; /* Used to read markdown */
|
||||
const Container = CompLibrary.Container;
|
||||
const GridBlock = CompLibrary.GridBlock;
|
||||
|
||||
const PascalLIGOTab = () => (
|
||||
<div
|
||||
id="tab-group-3-content-4"
|
||||
className="tab-pane active"
|
||||
data-group="group_3"
|
||||
tabIndex="-1"
|
||||
>
|
||||
<div>
|
||||
<span>
|
||||
<pre>
|
||||
<code className="hljs css language-Pascal">
|
||||
// variant defining pseudo multi-entrypoint actions
|
||||
<br />
|
||||
type action is
|
||||
<br />| Increment of int
|
||||
<br />| Decrement of int
|
||||
<br />
|
||||
<br />
|
||||
function add (const a : int ; const b : int) : int is
|
||||
<br /> block {"{ skip }"} with a + b<br />
|
||||
<br />
|
||||
function subtract (const a : int ; const b : int) : int is
|
||||
<br /> block {"{ skip }"} with a - b<br />
|
||||
<br />
|
||||
// real entrypoint that re-routes the flow based on the action
|
||||
provided
|
||||
<br />
|
||||
function main (const p : action ; const s : int) : (list(operation)
|
||||
* int) is
|
||||
<br /> block {"{ skip }"} with ((nil : list(operation)),
|
||||
<br /> case p of
|
||||
<br /> | Increment(n) -> add(s, n)
|
||||
<br /> | Decrement(n) -> subtract(s, n)
|
||||
<br /> end)
|
||||
<br />
|
||||
</code>
|
||||
</pre>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
|
||||
const CamelLIGOTab = () => (
|
||||
<div
|
||||
id="tab-group-3-content-5"
|
||||
className="tab-pane"
|
||||
data-group="group_3"
|
||||
tabIndex="-1"
|
||||
>
|
||||
<div>
|
||||
<pre>
|
||||
<code className="hljs css language-Pascal">
|
||||
type storage = int <br />
|
||||
<br />
|
||||
(* variant defining pseudo multi-entrypoint actions *) <br />
|
||||
<br />
|
||||
type action =<br />| Increment of int
|
||||
<br />| Decrement of int
|
||||
<br />
|
||||
<br />
|
||||
let add (a: int) (b: int) : int = a + b<br />
|
||||
<br />
|
||||
let subtract (a: int) (b: int) : int = a - b<br />
|
||||
<br />
|
||||
(* real entrypoint that re-routes the flow based on the action
|
||||
provided *)
|
||||
<br />
|
||||
<br />
|
||||
let%entry main (p : action) storage =<br /> let storage =<br /> match
|
||||
p with
|
||||
<br /> | Increment n -> add storage n<br /> | Decrement n -> subtract
|
||||
storage n<br /> in (([] : operation list), storage)
|
||||
<br />
|
||||
</code>
|
||||
</pre>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
|
||||
const LinkButton = props => (
|
||||
<a href={props.href} target={props.target}>
|
||||
<button className={props.className}>{props.children}</button>
|
||||
</a>
|
||||
);
|
||||
|
||||
class HomeSplash extends React.Component {
|
||||
render() {
|
||||
const {siteConfig, language = ''} = this.props;
|
||||
const {baseUrl, docsUrl} = siteConfig;
|
||||
const docsPart = `${docsUrl ? `${docsUrl}/` : ''}`;
|
||||
const langPart = `${language ? `${language}/` : ''}`;
|
||||
const { siteConfig, language = "" } = this.props;
|
||||
const { baseUrl, docsUrl } = siteConfig;
|
||||
const docsPart = `${docsUrl ? `${docsUrl}/` : ""}`;
|
||||
const langPart = `${language ? `${language}/` : ""}`;
|
||||
const docUrl = doc => `${baseUrl}${docsPart}${langPart}${doc}`;
|
||||
|
||||
const SplashContainer = props => (
|
||||
<div className="homeContainer">
|
||||
<div className="homeSplashFade">
|
||||
<div className="wrapper homeWrapper">
|
||||
|
||||
const SampleCode = props => (
|
||||
<div className="sample-code-container">
|
||||
<div className="sample-code">
|
||||
<div className="tabs">
|
||||
<div className="nav-tabs">
|
||||
<div id="tab-group-3-tab-4" className="nav-link active" data-group="group_3"
|
||||
data-tab="tab-group-3-content-4">PascaLIGO</div>
|
||||
<div className="nav-link" data-group="group_3"
|
||||
data-tab="tab-group-3-content-5">CameLIGO</div>
|
||||
<div className="nav-link">ReasonLIGO (coming soon) </div>
|
||||
{/* <div id="tab-group-3-tab-5" className="nav-link" data-group="group_3"
|
||||
data-tab="tab-group-3-content-5">Camligo</div> */}
|
||||
<div
|
||||
id="tab-group-3-tab-4"
|
||||
className="nav-link active"
|
||||
data-group="group_3"
|
||||
data-tab="tab-group-3-content-4"
|
||||
>
|
||||
PascaLIGO
|
||||
</div>
|
||||
<div
|
||||
className="nav-link"
|
||||
data-group="group_3"
|
||||
data-tab="tab-group-3-content-5"
|
||||
>
|
||||
CameLIGO
|
||||
</div>
|
||||
<div className="disabled">ReasonLIGO (coming soon) </div>
|
||||
</div>
|
||||
<div className="tab-content">
|
||||
<div id="tab-group-3-content-4" className="tab-pane active" data-group="group_3" tabIndex="-1">
|
||||
<div>
|
||||
<span>
|
||||
<pre><code className="hljs css language-Pascal">// variant defining pseudo multi-entrypoint actions<br />type action is<br />| Increment of int<br />| Decrement of int<br /><br />function add (const a : int ; const b : int) : int is<br /> block {'{ skip }'} with a + b<br /><br />function subtract (const a : int ; const b : int) : int is<br /> block {'{ skip }'} with a - b<br /><br />// real entrypoint that re-routes the flow based on the action provided<br />function main (const p : action ; const s : int) : (list(operation) * int) is<br /> block {'{ skip }'} with ((nil : list(operation)),<br /> case p of<br /> | Increment(n) -> add(s, n)<br /> | Decrement(n) -> subtract(s, n)<br /> end)<br /></code></pre>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<div id="tab-group-3-content-5" className="tab-pane" data-group="group_3" tabIndex="-1">
|
||||
<div>
|
||||
<pre>
|
||||
<code className="hljs css language-Pascal">
|
||||
type storage = int <br/><br/>(* variant defining pseudo multi-entrypoint actions *) <br/><br/>type action =<br/>| Increment of int<br/>| Decrement of int<br/><br/>let add (a: int) (b: int) : int = a + b<br/><br/>let subtract (a: int) (b: int) : int = a - b<br/><br/>(* real entrypoint that re-routes the flow based on the action provided *)<br/><br/>let%entry main (p : action) storage =<br/> let storage =<br/> match p with<br/> | Increment n -> add storage n<br/> | Decrement n -> subtract storage n<br/> in (([] : operation list), storage)<br/>
|
||||
</code>
|
||||
</pre>
|
||||
</div>
|
||||
</div>
|
||||
{PascalLIGOTab()}
|
||||
{CamelLIGOTab()}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{props.children}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
|
||||
const Logo = props => (
|
||||
<div className="projectLogo">
|
||||
<img src={props.img_src} alt="Project Logo" />
|
||||
</div>
|
||||
);
|
||||
|
||||
const ProjectTitle = () => (
|
||||
<h2 className="projectTitle">
|
||||
<small>{siteConfig.tagline}</small>
|
||||
</h2>
|
||||
);
|
||||
|
||||
const PromoSection = props => (
|
||||
<div className="section promoSection">
|
||||
<div className="promoRow">
|
||||
<div className="pluginRowBlock">{props.children}</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
|
||||
const Button = props => (
|
||||
<div className="pluginWrapper buttonWrapper">
|
||||
<a className="button" href={props.href} target={props.target}>
|
||||
{props.children}
|
||||
</a>
|
||||
</div>
|
||||
);
|
||||
|
||||
return (
|
||||
<SplashContainer>
|
||||
<div className="inner">
|
||||
<ProjectTitle siteConfig={siteConfig} />
|
||||
<PromoSection>
|
||||
<Button href={docUrl('setup/installation.html')}>Get Started</Button>
|
||||
<Button href={docUrl('tutorials/get-started/tezos-taco-shop-smart-contract')}>Tutorials</Button>
|
||||
<Button href={docUrl('contributors/origin.html')}>Contribute</Button>
|
||||
</PromoSection>
|
||||
<div className="home-container">
|
||||
<div className="home-text">
|
||||
<h4 className="tagline-text">{siteConfig.tagline}</h4>
|
||||
<p className="body">{siteConfig.taglineSub}</p>
|
||||
<LinkButton
|
||||
href={docUrl("setup/installation.html")}
|
||||
className="large-primary-button"
|
||||
>
|
||||
Get Started
|
||||
</LinkButton>
|
||||
</div>
|
||||
</SplashContainer>
|
||||
<SampleCode />
|
||||
</div>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class Index extends React.Component {
|
||||
render() {
|
||||
const {config: siteConfig, language = ''} = this.props;
|
||||
const {baseUrl} = siteConfig;
|
||||
const { config: siteConfig, language = "" } = this.props;
|
||||
const { baseUrl } = siteConfig;
|
||||
|
||||
const Block = props => (
|
||||
<Container
|
||||
padding={['bottom', 'top']}
|
||||
padding={["bottom", "top"]}
|
||||
id={props.id}
|
||||
background={props.background}>
|
||||
background={props.background}
|
||||
>
|
||||
<GridBlock
|
||||
align="center"
|
||||
contents={props.children}
|
||||
@ -126,7 +177,8 @@ class Index extends React.Component {
|
||||
const FeatureCallout = () => (
|
||||
<div
|
||||
className="productShowcaseSection paddingBottom"
|
||||
style={{textAlign: 'center'}}>
|
||||
style={{ textAlign: "center" }}
|
||||
>
|
||||
<h2>Feature Callout</h2>
|
||||
<MarkdownBlock>These are features of this project</MarkdownBlock>
|
||||
</div>
|
||||
@ -137,13 +189,13 @@ class Index extends React.Component {
|
||||
{[
|
||||
{
|
||||
content:
|
||||
'To make your landing page more attractive, use illustrations! Check out ' +
|
||||
'[**unDraw**](https://undraw.co/) which provides you with customizable illustrations which are free to use. ' +
|
||||
'The illustrations you see on this page are from unDraw.',
|
||||
"To make your landing page more attractive, use illustrations! Check out " +
|
||||
"[**unDraw**](https://undraw.co/) which provides you with customizable illustrations which are free to use. " +
|
||||
"The illustrations you see on this page are from unDraw.",
|
||||
image: `${baseUrl}img/undraw_code_review.svg`,
|
||||
imageAlign: 'left',
|
||||
title: 'Wonderful SVG Illustrations',
|
||||
},
|
||||
imageAlign: "left",
|
||||
title: "Wonderful SVG Illustrations"
|
||||
}
|
||||
]}
|
||||
</Block>
|
||||
);
|
||||
@ -153,11 +205,11 @@ class Index extends React.Component {
|
||||
{[
|
||||
{
|
||||
content:
|
||||
'This is another description of how this project is useful',
|
||||
"This is another description of how this project is useful",
|
||||
image: `${baseUrl}img/undraw_note_list.svg`,
|
||||
imageAlign: 'right',
|
||||
title: 'Description',
|
||||
},
|
||||
imageAlign: "right",
|
||||
title: "Description"
|
||||
}
|
||||
]}
|
||||
</Block>
|
||||
);
|
||||
@ -167,58 +219,69 @@ class Index extends React.Component {
|
||||
{[
|
||||
{
|
||||
content:
|
||||
'Each new Docusaurus project has **randomly-generated** theme colors.',
|
||||
"Each new Docusaurus project has **randomly-generated** theme colors.",
|
||||
image: `${baseUrl}img/undraw_youtube_tutorial.svg`,
|
||||
imageAlign: 'right',
|
||||
title: 'Randomly Generated Theme Colors',
|
||||
},
|
||||
imageAlign: "right",
|
||||
title: "Randomly Generated Theme Colors"
|
||||
}
|
||||
]}
|
||||
</Block>
|
||||
);
|
||||
|
||||
const FeatureCard = props => (
|
||||
<div className="card" key={props.title}>
|
||||
<img src={props.image} />
|
||||
<div className="card-text">
|
||||
<h4>{props.title}</h4>
|
||||
<p className="body">{props.content}</p>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
|
||||
const Features = () => (
|
||||
<div className="features">
|
||||
<h1 className="sectionTitle blockTitle">Features</h1>
|
||||
<Block layout="fourColumn">
|
||||
<h2>Features</h2>
|
||||
|
||||
<div className="flex-inline-container">
|
||||
{[
|
||||
{
|
||||
content: 'Write in PascaLIGO (pascal-like syntax) or CameLIGO (caml-like syntax). If you know OCaml, you can also add your own syntax.',
|
||||
image: `${baseUrl}img/edit.svg`,
|
||||
imageAlign: 'top',
|
||||
title: 'Syntax Agnostic',
|
||||
content:
|
||||
"Write types, then code, and benefit from the safety coming from type systems.",
|
||||
image: `${baseUrl}img/strong-type-system.svg`,
|
||||
title: "Strong Type System"
|
||||
},
|
||||
{
|
||||
content: 'Write types, then code, and benefit from the safety coming from type systems.',
|
||||
image: `${baseUrl}img/lightning.svg`,
|
||||
imageAlign: 'top',
|
||||
title: 'Strong Type System',
|
||||
content:
|
||||
"Write in PascaLIGO (pascal-like syntax) or CameLIGO (caml-like syntax). If you know OCaml, you can also add your own syntax.",
|
||||
image: `${baseUrl}img/syntax-agnostic.svg`,
|
||||
title: "Syntax Agnostic"
|
||||
},
|
||||
|
||||
{
|
||||
content: 'With Granary, you can use LIGO as a lib from NodeJS.',
|
||||
image: `${baseUrl}img/puzzle.svg`,
|
||||
imageAlign: 'top',
|
||||
title: 'Easy Integration',
|
||||
content: "With Granary, you can use LIGO as a lib from NodeJS.",
|
||||
image: `${baseUrl}img/easy-integration.svg`,
|
||||
title: "Easy Integration"
|
||||
}
|
||||
]}
|
||||
</Block>
|
||||
].map(FeatureCard)}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
|
||||
const Roadmap = () => (
|
||||
<div className="roadmap">
|
||||
<Block background="light" >
|
||||
<Block background="light">
|
||||
{[
|
||||
{
|
||||
content:
|
||||
content:
|
||||
"<h4>June 2019</h4>" +
|
||||
"<em><ul>" +
|
||||
"<em><ul>" +
|
||||
"<li>First public release</li>" +
|
||||
"<li>PascaLIGO and CameLIGO syntaxes</li>" +
|
||||
"<li>Docs and Tutorials</li>" +
|
||||
"<li>Integration testing in ReasonML/JS with Granary</li>" +
|
||||
"</ul></em>" +
|
||||
"<h4>July 2019</h4>" +
|
||||
"<em><ul>" +
|
||||
"<em><ul>" +
|
||||
"<li>Try LIGO online editor</li>" +
|
||||
"<li>Unit testing toolkit</li>" +
|
||||
"<li>ReasonLIGO syntax support</li>" +
|
||||
@ -229,9 +292,9 @@ class Index extends React.Component {
|
||||
"Long term plans will be announced soon" +
|
||||
"</em>",
|
||||
image: ``,
|
||||
imageAlign: 'right',
|
||||
title: 'Roadmap',
|
||||
},
|
||||
imageAlign: "right",
|
||||
title: "Roadmap"
|
||||
}
|
||||
]}
|
||||
</Block>
|
||||
</div>
|
||||
@ -242,25 +305,23 @@ class Index extends React.Component {
|
||||
return null;
|
||||
}
|
||||
|
||||
const showcase = siteConfig.partners
|
||||
const PartnerShowcase = siteConfig.partners
|
||||
.filter(user => user.pinned)
|
||||
.map(user => (
|
||||
<a href={user.infoLink} key={user.infoLink}>
|
||||
<a className="partner-link" href={user.infoLink} key={user.infoLink}>
|
||||
<img src={user.image} alt={user.caption} title={user.caption} />
|
||||
</a>
|
||||
));
|
||||
|
||||
const pageUrl = page => baseUrl + (language ? `${language}/` : '') + page;
|
||||
|
||||
return (
|
||||
<div className="productShowcaseSection paddingBottom">
|
||||
<h1 className="sectionTitle">Partners</h1>
|
||||
<div className="logos">{showcase}</div>
|
||||
{/* <div className="more-users">
|
||||
<a className="button" href={pageUrl('users.html')}>
|
||||
More {siteConfig.title} Users
|
||||
</a>
|
||||
</div> */}
|
||||
<div className="partners-container hide-small">
|
||||
{PartnerShowcase}
|
||||
<div className="partners-text">
|
||||
<h3>Our Partners</h3>
|
||||
<p className="body">
|
||||
We are not alone in this world -- here're some guys who support us
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
@ -273,32 +334,28 @@ class Index extends React.Component {
|
||||
const showcase = siteConfig.team
|
||||
.filter(user => user.pinned)
|
||||
.map(user => (
|
||||
<a href={user.infoLink} key={user.infoLink}>
|
||||
<img src={user.image} alt={user.caption} title={user.caption} />
|
||||
<p>{user.caption}</p>
|
||||
<a
|
||||
className="profileContainer"
|
||||
href={user.infoLink}
|
||||
key={user.infoLink}
|
||||
>
|
||||
<img className="profileImage" src={user.image} alt={user.caption} />
|
||||
<p className="headline">{user.caption}</p>
|
||||
</a>
|
||||
));
|
||||
|
||||
const pageUrl = page => baseUrl + (language ? `${language}/` : '') + page;
|
||||
|
||||
return (
|
||||
<div className="productShowcaseSection paddingBottom team">
|
||||
<h1 className="sectionTitle">Team</h1>
|
||||
<div className="logos">{showcase}</div>
|
||||
{/* <div className="more-users">
|
||||
<a className="button" href={pageUrl('users.html')}>
|
||||
More {siteConfig.title} Users
|
||||
</a>
|
||||
</div> */}
|
||||
<div className="team">
|
||||
<h2>Team</h2>
|
||||
<div className="flex-inline-container">{showcase}</div>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
return (
|
||||
<div>
|
||||
<div className="landing">
|
||||
<HomeSplash siteConfig={siteConfig} language={language} />
|
||||
<div className="mainContainer">
|
||||
|
||||
<Features />
|
||||
{/* <Roadmap /> */}
|
||||
{/* <FeatureCallout /> */}
|
||||
|
@ -1,21 +1,39 @@
|
||||
{
|
||||
"docs": {
|
||||
"Setup": ["setup/installation", "setup/editor-support"],
|
||||
"Language Basics": ["language-basics/cheat-sheet", "language-basics/types", "language-basics/variables", "language-basics/functions", "language-basics/entrypoints", "language-basics/operators"],
|
||||
"Language Basics": [
|
||||
"language-basics/cheat-sheet",
|
||||
"language-basics/types",
|
||||
"language-basics/variables",
|
||||
"language-basics/functions",
|
||||
"language-basics/entrypoints",
|
||||
"language-basics/operators"
|
||||
],
|
||||
"API": ["api-cli-commands"]
|
||||
},
|
||||
"contributors-docs": {
|
||||
"Introduction": ["contributors/origin", "contributors/philosophy", "contributors/getting-started", "contributors/documentation-and-releases"],
|
||||
"Introduction": [
|
||||
"contributors/origin",
|
||||
"contributors/philosophy",
|
||||
"contributors/getting-started",
|
||||
"contributors/documentation-and-releases"
|
||||
],
|
||||
"Big Picture": [
|
||||
"contributors/big-picture/overview",
|
||||
"contributors/big-picture/front-end",
|
||||
"contributors/big-picture/middle-end",
|
||||
"contributors/big-picture/front-end",
|
||||
"contributors/big-picture/middle-end",
|
||||
"contributors/big-picture/back-end",
|
||||
"contributors/big-picture/vendors"
|
||||
],
|
||||
"Road Map": ["contributors/road-map/short-term", "contributors/road-map/long-term"]
|
||||
"Road Map": [
|
||||
"contributors/road-map/short-term",
|
||||
"contributors/road-map/long-term"
|
||||
]
|
||||
},
|
||||
"tutorials": {
|
||||
"Get Started": ["tutorials/get-started/tezos-taco-shop-smart-contract", "tutorials/get-started/tezos-taco-shop-payout"]
|
||||
"Get Started": [
|
||||
"tutorials/get-started/tezos-taco-shop-smart-contract",
|
||||
"tutorials/get-started/tezos-taco-shop-payout"
|
||||
]
|
||||
}
|
||||
}
|
||||
|
@ -11,99 +11,104 @@
|
||||
// List of projects/orgs using your project for the users page.
|
||||
const partners = [
|
||||
{
|
||||
caption: 'Nomadic Labs',
|
||||
caption: "Nomadic Labs",
|
||||
// You will need to prepend the image path with your baseUrl
|
||||
// if it is not '/', like: '/test-site/img/image.jpg'.
|
||||
image: '/img/nomadic-logo.jpg',
|
||||
infoLink: 'https://www.nomadic-labs.com/',
|
||||
pinned: true,
|
||||
image: "/img/nomadic-logo.svg",
|
||||
infoLink: "https://www.nomadic-labs.com/",
|
||||
pinned: true
|
||||
},
|
||||
{
|
||||
caption: 'Tocqueville Group',
|
||||
caption: "Tocqueville Group",
|
||||
// You will need to prepend the image path with your baseUrl
|
||||
// if it is not '/', like: '/test-site/img/image.jpg'.
|
||||
image: '/img/tq-logo.svg',
|
||||
infoLink: 'https://tqgroup.io/',
|
||||
pinned: true,
|
||||
image: "/img/tq-logo-2.svg",
|
||||
infoLink: "https://tqgroup.io/",
|
||||
pinned: true
|
||||
},
|
||||
{
|
||||
caption: 'Stove Labs',
|
||||
caption: "Stove Labs",
|
||||
// You will need to prepend the image path with your baseUrl
|
||||
// if it is not '/', like: '/test-site/img/image.jpg'.
|
||||
image: '/img/stove-logo.png',
|
||||
infoLink: 'https://stove-labs.com',
|
||||
pinned: true,
|
||||
},
|
||||
image: "/img/stove-logo.svg",
|
||||
infoLink: "https://stove-labs.com",
|
||||
pinned: true
|
||||
}
|
||||
];
|
||||
|
||||
const team = [
|
||||
{
|
||||
caption: 'Gabriel Alfour',
|
||||
caption: "Gabriel Alfour",
|
||||
// You will need to prepend the image path with your baseUrl
|
||||
// if it is not '/', like: '/test-site/img/image.jpg'.
|
||||
image: '/img/user.png',
|
||||
infoLink: 'https://gitlab.com/gabriel.alfour',
|
||||
pinned: true,
|
||||
image: "/img/user.svg",
|
||||
infoLink: "https://gitlab.com/gabriel.alfour",
|
||||
pinned: true
|
||||
},
|
||||
{
|
||||
caption: 'Georges Dupéron',
|
||||
caption: "Georges Dupéron",
|
||||
// You will need to prepend the image path with your baseUrl
|
||||
// if it is not '/', like: '/test-site/img/image.jpg'.
|
||||
image: '/img/user.png',
|
||||
infoLink: 'https://gitlab.com/georges.duperon',
|
||||
pinned: true,
|
||||
image: "/img/user.svg",
|
||||
infoLink: "https://gitlab.com/georges.duperon",
|
||||
pinned: true
|
||||
},
|
||||
{
|
||||
caption: 'Christian Rinderknecht',
|
||||
caption: "Christian Rinderknecht",
|
||||
// You will need to prepend the image path with your baseUrl
|
||||
// if it is not '/', like: '/test-site/img/image.jpg'.
|
||||
image: '/img/christian.jpeg',
|
||||
infoLink: 'https://github.com/rinderknecht',
|
||||
pinned: true,
|
||||
image: "/img/christian.jpeg",
|
||||
infoLink: "https://github.com/rinderknecht",
|
||||
pinned: true
|
||||
},
|
||||
{
|
||||
caption: 'Brice Aldrich',
|
||||
caption: "Brice Aldrich",
|
||||
// You will need to prepend the image path with your baseUrl
|
||||
// if it is not '/', like: '/test-site/img/image.jpg'.
|
||||
image: '/img/brice.png',
|
||||
infoLink: 'https://github.com/DefinitelyNotAGoat',
|
||||
pinned: true,
|
||||
image: "/img/brice.png",
|
||||
infoLink: "https://github.com/DefinitelyNotAGoat",
|
||||
pinned: true
|
||||
},
|
||||
{
|
||||
caption: 'Matej Sima',
|
||||
caption: "Matej Sima",
|
||||
// You will need to prepend the image path with your baseUrl
|
||||
// if it is not '/', like: '/test-site/img/image.jpg'.
|
||||
image: '/img/matej.jpg',
|
||||
infoLink: 'https://github.com/maht0rz',
|
||||
pinned: true,
|
||||
},
|
||||
image: "/img/matej.jpg",
|
||||
infoLink: "https://github.com/maht0rz",
|
||||
pinned: true
|
||||
}
|
||||
];
|
||||
|
||||
const siteConfig = {
|
||||
title: 'LIGO', // Title for your website.
|
||||
tagline: 'LIGO is a statically typed high-level smart-contract language that compiles down to Michelson. It seeks to be easy to use, extensible and safe.',
|
||||
url: 'https://your-docusaurus-test-site.com', // Your website URL
|
||||
baseUrl: '/', // Base URL for your project */
|
||||
title: "LIGO", // Title for your website.
|
||||
tagline:
|
||||
"LIGO is a statically typed high-level smart-contract language that compiles down to Michelson.",
|
||||
taglineSub: "It seeks to be easy to use, extensible and safe.",
|
||||
url: "https://your-docusaurus-test-site.com", // Your website URL
|
||||
baseUrl: "/", // Base URL for your project */
|
||||
// For github.io type URLs, you would set the url and baseUrl like:
|
||||
// url: 'https://facebook.github.io',
|
||||
// baseUrl: '/test-site/',
|
||||
|
||||
// Used for publishing and more
|
||||
projectName: 'ligo',
|
||||
organizationName: 'marigold',
|
||||
projectName: "ligo",
|
||||
organizationName: "marigold",
|
||||
// For top-level user or org sites, the organization is still the same.
|
||||
// e.g., for the https://JoelMarcey.github.io site, it would be set like...
|
||||
// organizationName: 'JoelMarcey'
|
||||
|
||||
// For no header links in the top nav bar -> headerLinks: [],
|
||||
headerLinks: [
|
||||
{doc: 'setup/installation', label: 'Docs'},
|
||||
{doc: 'tutorials/get-started/tezos-taco-shop-smart-contract', label: 'Tutorials'},
|
||||
{ blog: true, label: 'Blog' },
|
||||
{ doc: "setup/installation", label: "Docs" },
|
||||
{
|
||||
doc: "tutorials/get-started/tezos-taco-shop-smart-contract",
|
||||
label: "Tutorials"
|
||||
},
|
||||
{ blog: true, label: "Blog" },
|
||||
// TODO: { href: "/odoc", label: "Api" },
|
||||
{doc: 'contributors/origin', label: 'Contribute'},
|
||||
{href: 'https://discord.gg/9rhYaEt', label: ''},
|
||||
{ search: true },
|
||||
{ doc: "contributors/origin", label: "Contribute" },
|
||||
{ href: "https://discord.gg/9rhYaEt", label: "" },
|
||||
{ search: true }
|
||||
],
|
||||
|
||||
// If you have users set above, you add it here:
|
||||
@ -111,14 +116,14 @@ const siteConfig = {
|
||||
team,
|
||||
|
||||
/* path to images for header/footer */
|
||||
headerIcon: 'img/logo.svg',
|
||||
footerIcon: 'img/logo.svg',
|
||||
favicon: 'img/logo.svg',
|
||||
headerIcon: "img/logo.svg",
|
||||
footerIcon: "img/logo.svg",
|
||||
favicon: "img/logo.svg",
|
||||
|
||||
/* Colors for website */
|
||||
colors: {
|
||||
primaryColor: '#1A1A1A',
|
||||
secondaryColor: '#1A1A1A',
|
||||
primaryColor: "#1A1A1A",
|
||||
secondaryColor: "#1A1A1A"
|
||||
},
|
||||
|
||||
/* Custom fonts for website */
|
||||
@ -140,20 +145,20 @@ const siteConfig = {
|
||||
|
||||
highlight: {
|
||||
// Highlight.js theme to use for syntax highlighting in code blocks.
|
||||
theme: 'default',
|
||||
theme: "default"
|
||||
},
|
||||
|
||||
// Add custom scripts here that would be placed in <script> tags.
|
||||
scripts: ['https://buttons.github.io/buttons.js'],
|
||||
scripts: ["https://buttons.github.io/buttons.js"],
|
||||
|
||||
// On page navigation for the current documentation page.
|
||||
onPageNav: 'separate',
|
||||
onPageNav: "separate",
|
||||
// No .html extensions for paths.
|
||||
cleanUrl: true,
|
||||
|
||||
// Open Graph and Twitter card images.
|
||||
ogImage: 'img/undraw_online.svg',
|
||||
twitterImage: 'img/undraw_tweetstorm.svg',
|
||||
ogImage: "img/undraw_online.svg",
|
||||
twitterImage: "img/undraw_tweetstorm.svg",
|
||||
|
||||
// Show documentation's last contributor's name.
|
||||
// enableUpdateBy: true,
|
||||
@ -163,13 +168,15 @@ const siteConfig = {
|
||||
|
||||
// You may provide arbitrary config keys to be used as needed by your
|
||||
// template. For example, if you need your repo's URL...
|
||||
repoUrl: 'https://gitlab.com/ligolang/ligo',
|
||||
|
||||
repoUrl: "https://gitlab.com/ligolang/ligo",
|
||||
stylesheets: [
|
||||
"https://fonts.googleapis.com/css?family=DM+Sans|Open+Sans|Source+Code+Pro&display=swap"
|
||||
],
|
||||
algolia: {
|
||||
apiKey: '12be98d9fd4242a5f16b70a5cc6b0158',
|
||||
indexName: 'ligolang',
|
||||
apiKey: "12be98d9fd4242a5f16b70a5cc6b0158",
|
||||
indexName: "ligolang",
|
||||
algoliaOptions: {} // Optional, if provided by Algolia
|
||||
},
|
||||
}
|
||||
};
|
||||
|
||||
module.exports = siteConfig;
|
||||
|
@ -1,248 +1,596 @@
|
||||
.projectTitle small {
|
||||
max-width: 700px;
|
||||
text-align: center;
|
||||
margin: 0 auto;
|
||||
margin-top: 0.7em;
|
||||
:root {
|
||||
--color-primary-brand: #3aa0ff;
|
||||
--color-secondary-brand: #fc683a;
|
||||
--color-accent: #37d7c3;
|
||||
--color-primary-text: #0d0f33;
|
||||
--color-secondary-text: #5a5c74;
|
||||
--color-gray: #ebebeb;
|
||||
--color-light-blue: #ebf6ff;
|
||||
--color-light-gray: #fafafa;
|
||||
--color-white: #ffffff;
|
||||
--color-code-background1: #eff4f7;
|
||||
--color-code-background2: #d2dfe9;
|
||||
--padding-level-1: 20px;
|
||||
--padding-level-2: 25px;
|
||||
--padding-level-3: 30px;
|
||||
--padding-level-4: 45px;
|
||||
--padding-level-5: 60px;
|
||||
--padding-level-6: 100px;
|
||||
}
|
||||
|
||||
.fixedHeaderContainer header .headerTitleWithLogo {
|
||||
display: none;
|
||||
html {
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
.fixedHeaderContainer header img {}
|
||||
|
||||
.nav-footer {
|
||||
background: #1A1A1A;
|
||||
h1,
|
||||
h2,
|
||||
h3,
|
||||
h4,
|
||||
.landing .headline {
|
||||
font-family: "DM Sans", sans-serif;
|
||||
font-weight: bold;
|
||||
/** Override docusaurus rule that makes a huge top margin **/
|
||||
margin-top: 1rem;
|
||||
}
|
||||
|
||||
.navigationSlider .slidingNav {
|
||||
background: #1A1A1A;
|
||||
body,
|
||||
.body,
|
||||
.headline,
|
||||
.subhead,
|
||||
.footnote {
|
||||
font-family: "Open Sans", sans-serif;
|
||||
}
|
||||
|
||||
.homeContainer {
|
||||
box-shadow: inset 0 -10px 10px -6px rgba(177, 176, 176, 0.2);
|
||||
background: #f6f4f4;
|
||||
}
|
||||
|
||||
.homeContainer .hljs {
|
||||
text-align: left;
|
||||
background: transparent;
|
||||
}
|
||||
|
||||
.tabs {
|
||||
max-width: 800px;
|
||||
margin: 0 auto;
|
||||
border-top: none;
|
||||
border-bottom: 4px solid #e0e0e0;
|
||||
}
|
||||
|
||||
.tabs .nav-tabs > div {
|
||||
cursor: pointer;
|
||||
color: #24292e;
|
||||
border-bottom: none;
|
||||
padding-bottom: 8px;
|
||||
}
|
||||
.tab-content {
|
||||
padding-top: 12px;
|
||||
}
|
||||
|
||||
.tabs .nav-tabs > div.active {
|
||||
border-bottom: 4px solid #1A1A1A;
|
||||
}
|
||||
|
||||
|
||||
.homeContainer .tabs .nav-tabs > div:last-of-type {
|
||||
cursor: default;
|
||||
color: #24292e64;
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
.tab-content {
|
||||
border-top: 4px solid #e0e0e0;
|
||||
}
|
||||
|
||||
.nav-tabs {
|
||||
border: none;
|
||||
position: relative;
|
||||
top: 4px;
|
||||
}
|
||||
|
||||
|
||||
.button {
|
||||
border: 1px solid #B2210C;
|
||||
color: #B2210C;
|
||||
}
|
||||
|
||||
.button:hover, .promoSection .buttonWrapper:first-of-type > a.button {
|
||||
background: #B2210C;
|
||||
color: white;
|
||||
}
|
||||
|
||||
|
||||
blockquote {
|
||||
background-color: rgba(26, 26, 26, 0.3);
|
||||
border-left: 8px solid rgba(26, 26, 26, 0.1);
|
||||
color: rgba(255,255,255, 1);
|
||||
}
|
||||
|
||||
blockquote code {
|
||||
opacity: 0.5;
|
||||
}
|
||||
/*
|
||||
blockquote a {
|
||||
color: rgba(255,255,255, 0.8);
|
||||
border-bottom: 1px solid rgba(255,255,255, 0.8);
|
||||
}
|
||||
|
||||
blockquote a:hover {
|
||||
color: rgba(255,255,255, 1);
|
||||
border-bottom: 1px solid rgba(255,255,255, 1);
|
||||
} */
|
||||
/*
|
||||
blockquote {
|
||||
background-color: rgba(252, 214, 0, 0.687);
|
||||
border-left-color: rgba(240, 210, 37, 1);
|
||||
color: rgba(0, 0, 0, 0.632);
|
||||
} */
|
||||
|
||||
a {
|
||||
color: rgba(178, 33, 12, 0.8);
|
||||
}
|
||||
|
||||
a:hover {
|
||||
color: rgba(178, 33, 12, 1);
|
||||
}
|
||||
|
||||
.homeContainer .homeWrapper .projectLogo {
|
||||
display: block;
|
||||
position: relative;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.projectTitle {
|
||||
margin-top: 30px;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
.projectTitle small {
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
.promoSection .promoRow {
|
||||
padding-top: 0;
|
||||
margin-top: 30px;
|
||||
}
|
||||
|
||||
.promoSection .promoRow .pluginRowBlock .pluginWrapper {
|
||||
padding: 0 4px;
|
||||
}
|
||||
|
||||
.blockElement {
|
||||
color: #1A1A1A;
|
||||
}
|
||||
|
||||
.blockImage {
|
||||
margin-bottom: 0px;
|
||||
}
|
||||
|
||||
.blockContent {
|
||||
margin-top: -25px;
|
||||
}
|
||||
|
||||
.features {
|
||||
background: white;
|
||||
margin-top: -40px;
|
||||
position: relative;
|
||||
text-align: center;
|
||||
/* box-shadow: 0 10px 10px -6px rgba(177, 176, 176, 0.3); */
|
||||
}
|
||||
|
||||
.sectionTitle {
|
||||
border-bottom: 4px solid #e0e0e0;
|
||||
max-width: 200px;
|
||||
margin: 0 auto;
|
||||
margin-top: 35px;
|
||||
padding-bottom: 15px;
|
||||
}
|
||||
|
||||
.sectionTitle.blockTitle {
|
||||
margin-bottom: -20px;
|
||||
}
|
||||
|
||||
.lightBackground, body, html {
|
||||
background: white;
|
||||
}
|
||||
|
||||
.copyright a {
|
||||
color: #B2210C;
|
||||
}
|
||||
|
||||
.productShowcaseSection.team .logos img {
|
||||
border-radius: 50%;
|
||||
height: 150px;
|
||||
margin-bottom: 0px;
|
||||
padding-left: 40px;
|
||||
padding-right: 40px;
|
||||
}
|
||||
|
||||
.productShowcaseSection.team .logos p {
|
||||
padding-top: 0px;
|
||||
}
|
||||
|
||||
.toc .toggleNav {
|
||||
margin-top: 12px;
|
||||
}
|
||||
|
||||
.mainContainer {
|
||||
padding-top: 60px;
|
||||
}
|
||||
|
||||
.tocActive .onPageNav > .toc-headings {
|
||||
padding-top: 24px;
|
||||
}
|
||||
|
||||
.docsSliderActive #tocToggler {
|
||||
opacity: 0;
|
||||
visibility: hidden;
|
||||
/** TODO: code font size is currently 85%; designs have it as 1rem (16px);
|
||||
this breaks some of the tiny-text in the internal pages, so wait until those
|
||||
are fixed to set this to the correct size
|
||||
**/
|
||||
.landing code,
|
||||
.mono {
|
||||
font-family: "Source Code Pro", monospace;
|
||||
font-size: 1rem;
|
||||
}
|
||||
|
||||
code {
|
||||
background: rgb(240, 240, 240);
|
||||
color: #444;
|
||||
font-family: "Source Code Pro", monospace;
|
||||
}
|
||||
|
||||
body > div.fixedHeaderContainer > div > header > div > nav > ul > li:nth-child(5) {
|
||||
background: url('/img/discord.svg');
|
||||
background-repeat: no-repeat;
|
||||
background-position: center center;
|
||||
min-width: 50px;
|
||||
padding-top: 5px;
|
||||
opacity: 0.8;
|
||||
h1 {
|
||||
font-size: 2.625rem;
|
||||
}
|
||||
.landing h1 {
|
||||
font-size: 4.5rem;
|
||||
}
|
||||
h2 {
|
||||
font-size: 2.25rem;
|
||||
}
|
||||
.landing h2 {
|
||||
font-size: 3rem;
|
||||
}
|
||||
h3 {
|
||||
font-size: 1.5rem;
|
||||
}
|
||||
.landing h3 {
|
||||
font-size: 2.25rem;
|
||||
}
|
||||
h4 {
|
||||
font-size: 1.125rem;
|
||||
}
|
||||
.landing h4 {
|
||||
font-size: 1.5rem;
|
||||
}
|
||||
.headline {
|
||||
font-weight: bold;
|
||||
font-size: 1rem;
|
||||
}
|
||||
.landing .headline {
|
||||
font-size: 1.125rem;
|
||||
}
|
||||
body,
|
||||
.body {
|
||||
font-size: 1rem;
|
||||
}
|
||||
.landing .body,
|
||||
.landing {
|
||||
font-size: 1.125rem;
|
||||
}
|
||||
.subhead {
|
||||
font-size: 0.875rem;
|
||||
}
|
||||
.landing .subhead {
|
||||
font-size: 1rem;
|
||||
}
|
||||
.footnote,
|
||||
footnote {
|
||||
font-size: 0.75rem;
|
||||
}
|
||||
|
||||
body > div.fixedHeaderContainer > div > header > div > nav > ul > li:nth-child(5):hover {
|
||||
opacity: 1;
|
||||
.fixedHeaderContainer header .headerTitleWithLogo {
|
||||
display: none;
|
||||
}
|
||||
|
||||
body > div.fixedHeaderContainer > div > header > div > nav > ul > li:nth-child(5) > a:hover {
|
||||
background: transparent;
|
||||
.fixedHeaderContainer header img {
|
||||
}
|
||||
|
||||
.nav-footer {
|
||||
background: var(--color-primary-text);
|
||||
}
|
||||
|
||||
.navigationSlider .slidingNav {
|
||||
background: #1a1a1a;
|
||||
}
|
||||
|
||||
.hljs {
|
||||
text-align: left;
|
||||
background: transparent;
|
||||
}
|
||||
|
||||
.tabs {
|
||||
max-width: 800px;
|
||||
margin: 0 auto;
|
||||
border-top: none;
|
||||
border-bottom: 4px solid #e0e0e0;
|
||||
}
|
||||
|
||||
.tabs .nav-tabs > div {
|
||||
cursor: pointer;
|
||||
color: #24292e;
|
||||
border-bottom: none;
|
||||
padding-bottom: 8px;
|
||||
}
|
||||
.tab-content {
|
||||
padding-top: 12px;
|
||||
}
|
||||
|
||||
.tabs .nav-tabs > div.active {
|
||||
border-bottom: 4px solid #1a1a1a;
|
||||
}
|
||||
|
||||
.disabled {
|
||||
cursor: default;
|
||||
color: #24292e64 !important;
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
.tab-content {
|
||||
border-top: 4px solid #e0e0e0;
|
||||
}
|
||||
|
||||
.nav-tabs {
|
||||
border: none;
|
||||
position: relative;
|
||||
top: 4px;
|
||||
}
|
||||
|
||||
/** Top Section **/
|
||||
.home-container {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
padding: var(--padding-level-3);
|
||||
}
|
||||
|
||||
.home-text {
|
||||
max-width: 40%;
|
||||
}
|
||||
|
||||
.sample-code-container {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
box-sizing: border-box;
|
||||
max-width: 60%;
|
||||
background: url("/img/geo.svg") top right/140px 140px no-repeat,
|
||||
url("/img/geo.svg") bottom left/200px 200px no-repeat;
|
||||
}
|
||||
|
||||
.sample-code {
|
||||
width: 80%;
|
||||
padding: 25px;
|
||||
box-shadow: 0px 0px 70px rgba(13, 15, 51, 0.06);
|
||||
background-color: white;
|
||||
}
|
||||
|
||||
blockquote {
|
||||
background-color: rgba(26, 26, 26, 0.3);
|
||||
border-left: 8px solid rgba(26, 26, 26, 0.1);
|
||||
color: rgba(255, 255, 255, 1);
|
||||
}
|
||||
|
||||
blockquote code {
|
||||
opacity: 0.5;
|
||||
}
|
||||
|
||||
a {
|
||||
color: var(--color-primary-text);
|
||||
}
|
||||
|
||||
a:hover {
|
||||
color: var(--color-primary-brand);
|
||||
}
|
||||
|
||||
.landing a {
|
||||
color: var(--color-white);
|
||||
}
|
||||
|
||||
.landing a:hover {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.promoSection .promoRow {
|
||||
padding-top: 0;
|
||||
margin-top: 30px;
|
||||
}
|
||||
|
||||
.promoSection .promoRow .pluginRowBlock .pluginWrapper {
|
||||
padding: 0 4px;
|
||||
}
|
||||
|
||||
.blockElement {
|
||||
color: #1a1a1a;
|
||||
}
|
||||
|
||||
.blockImage {
|
||||
margin-bottom: 0px;
|
||||
}
|
||||
|
||||
.blockContent {
|
||||
margin-top: -25px;
|
||||
}
|
||||
|
||||
.features,
|
||||
.team {
|
||||
background: white;
|
||||
margin-top: -40px;
|
||||
position: relative;
|
||||
text-align: center;
|
||||
/* box-shadow: 0 10px 10px -6px rgba(177, 176, 176, 0.3); */
|
||||
}
|
||||
|
||||
.sectionTitle {
|
||||
border-bottom: 4px solid #e0e0e0;
|
||||
margin: 0 auto;
|
||||
margin-top: 35px;
|
||||
padding-bottom: 15px;
|
||||
}
|
||||
|
||||
.sectionTitle.blockTitle {
|
||||
margin-bottom: -20px;
|
||||
}
|
||||
|
||||
.lightBackground,
|
||||
body,
|
||||
html {
|
||||
background: white;
|
||||
}
|
||||
|
||||
.copyright a {
|
||||
color: #b2210c;
|
||||
}
|
||||
|
||||
.toc .toggleNav {
|
||||
margin-top: 12px;
|
||||
}
|
||||
|
||||
.mainContainer {
|
||||
padding-top: 60px;
|
||||
}
|
||||
|
||||
.mainContainer > * {
|
||||
padding: var(--padding-level-4) 0;
|
||||
}
|
||||
|
||||
.tocActive .onPageNav > .toc-headings {
|
||||
padding-top: 24px;
|
||||
}
|
||||
|
||||
.docsSliderActive #tocToggler {
|
||||
opacity: 0;
|
||||
visibility: hidden;
|
||||
}
|
||||
|
||||
code {
|
||||
background: rgb(240, 240, 240);
|
||||
color: #444;
|
||||
}
|
||||
|
||||
body
|
||||
> div.fixedHeaderContainer
|
||||
> div
|
||||
> header
|
||||
> div
|
||||
> nav
|
||||
> ul
|
||||
> li:nth-child(5) {
|
||||
background: url("/img/discord.svg");
|
||||
background-repeat: no-repeat;
|
||||
background-position: center center;
|
||||
min-width: 50px;
|
||||
padding-top: 5px;
|
||||
opacity: 0.8;
|
||||
}
|
||||
|
||||
body
|
||||
> div.fixedHeaderContainer
|
||||
> div
|
||||
> header
|
||||
> div
|
||||
> nav
|
||||
> ul
|
||||
> li:nth-child(5):hover {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
body
|
||||
> div.fixedHeaderContainer
|
||||
> div
|
||||
> header
|
||||
> div
|
||||
> nav
|
||||
> ul
|
||||
> li:nth-child(5)
|
||||
> a:hover {
|
||||
background: transparent;
|
||||
}
|
||||
|
||||
.cheatsheet tr > td:first-of-type {
|
||||
min-width: 240px;
|
||||
min-width: 240px;
|
||||
}
|
||||
|
||||
/** Buttons **/
|
||||
|
||||
.button,
|
||||
.large-primary-button,
|
||||
.large-secondary-button {
|
||||
border: none;
|
||||
color: var(--color-white);
|
||||
font-size: 1rem;
|
||||
font-weight: normal;
|
||||
line-height: 1.375rem;
|
||||
text-transform: none;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.button,
|
||||
.button:hover {
|
||||
border-radius: 36px;
|
||||
padding: 10px 20px;
|
||||
background-color: var(--color-primary-brand);
|
||||
min-width: 130px;
|
||||
color: var(--color-white);
|
||||
}
|
||||
|
||||
.button:hover {
|
||||
box-shadow: 0px 2px 15px rgba(58, 160, 255, 0.3);
|
||||
}
|
||||
|
||||
.button:focus {
|
||||
background-color: #0078e8;
|
||||
}
|
||||
|
||||
.button[disabled] {
|
||||
background: rgba(58, 160, 255, 0.35);
|
||||
}
|
||||
|
||||
.large-primary-button,
|
||||
.large-primary-button:hover,
|
||||
.large-secondary-button,
|
||||
.large-secondary-button:hover {
|
||||
border-radius: 37px;
|
||||
padding: 5px 20px;
|
||||
min-height: 56px;
|
||||
min-width: 132px;
|
||||
color: var(--color-white);
|
||||
}
|
||||
|
||||
.large-primary-button {
|
||||
background-color: var(--color-primary-text);
|
||||
}
|
||||
|
||||
.large-primary-button:hover {
|
||||
box-shadow: 0px 2px 25px rgba(13, 15, 51, 0.3);
|
||||
}
|
||||
|
||||
.large-primary-button:focus {
|
||||
background-color: #010212;
|
||||
box-shadow: 0px 2px 25px rgba(13, 15, 51, 0.3);
|
||||
}
|
||||
.large-primary-button[disabled] {
|
||||
background: rgba(13, 15, 51, 0.35);
|
||||
}
|
||||
|
||||
.large-secondary-button {
|
||||
background-color: var(--color-secondary-brand);
|
||||
}
|
||||
|
||||
.large-secondary-button:hover {
|
||||
box-shadow: 0px 2px 25px rgba(252, 104, 58, 0.3);
|
||||
}
|
||||
|
||||
.large-secondary-button:focus {
|
||||
background-color: #f33e24;
|
||||
box-shadow: 0px 2px 25px rgba(252, 104, 58, 0.3);
|
||||
}
|
||||
.large-secondary-button[disabled] {
|
||||
background: rgba(252, 104, 58, 0.35);
|
||||
}
|
||||
|
||||
.version-button {
|
||||
background-color: var(--color-gray);
|
||||
padding: 5px;
|
||||
border-radius: 2px;
|
||||
color: var(--color-primary-text);
|
||||
}
|
||||
.version-button:hover {
|
||||
background-color: var(--color-light-blue);
|
||||
}
|
||||
.version-button:focus {
|
||||
background: rgba(47, 152, 249, 0.3);
|
||||
}
|
||||
.version-button[disabled] {
|
||||
background: rgba(58, 160, 255, 0.35);
|
||||
}
|
||||
|
||||
.page-button * {
|
||||
stroke: var(--color-primary-text);
|
||||
}
|
||||
.page-button:hover * {
|
||||
stroke: var(--color-secondary-text);
|
||||
}
|
||||
.page-button:focus * {
|
||||
stroke: #010212;
|
||||
}
|
||||
|
||||
.discord-button #background {
|
||||
fill: var(--color-primary-brand);
|
||||
}
|
||||
.discord-button:hover svg {
|
||||
box-shadow: 0px 2px 15px rgba(58, 160, 255, 0.3);
|
||||
}
|
||||
.discord-button:focus #background {
|
||||
fill: #0078e8;
|
||||
}
|
||||
|
||||
/** Profile Images **/
|
||||
.profileContainer {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
max-width: 20%;
|
||||
color: var(--color-primary-text);
|
||||
padding: 0 var(--padding-level-1);
|
||||
}
|
||||
|
||||
.profileContainer:hover {
|
||||
color: var(--color-primary-brand);
|
||||
}
|
||||
|
||||
.profileContainer:hover .profileImage {
|
||||
box-shadow: 12px 12px 0px var(--color-primary-brand);
|
||||
}
|
||||
|
||||
.profileImage {
|
||||
max-height: 195px;
|
||||
max-width: 195px;
|
||||
width: 100%;
|
||||
border: var(--color-gray);
|
||||
}
|
||||
|
||||
.flex-inline-container {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
justify-content: space-around;
|
||||
padding: var(--padding-level-1);
|
||||
flex-wrap: wrap;
|
||||
align-items: stretch;
|
||||
}
|
||||
|
||||
.team .flex-inline-container {
|
||||
align-items: flex-start;
|
||||
}
|
||||
|
||||
/** Feature Cards **/
|
||||
.card {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
padding: 2rem;
|
||||
align-items: center;
|
||||
justify-content: flex-start;
|
||||
max-width: 30%;
|
||||
background-color: var(--color-light-gray);
|
||||
}
|
||||
|
||||
.card:hover {
|
||||
background-color: var(--color-light-blue);
|
||||
}
|
||||
|
||||
.card-text {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
/** Partners **/
|
||||
.partners-container {
|
||||
background-color: var(--color-light-gray);
|
||||
display: flex;
|
||||
justify-content: space-around;
|
||||
align-content: center;
|
||||
padding: var(--padding-level-3);
|
||||
margin: var(--padding-level-4) 0;
|
||||
}
|
||||
|
||||
.partners-container a {
|
||||
display: flex;
|
||||
align-content: center;
|
||||
justify-content: center;
|
||||
margin: 0 10px;
|
||||
}
|
||||
|
||||
.partners-text {
|
||||
padding: 0 var(--padding-level-1);
|
||||
border-left: 5px solid var(--color-primary-brand);
|
||||
}
|
||||
|
||||
@media (min-width: 560px) and (max-width: 768px) {
|
||||
/** Special rules to reorient feature cards at only one screen size**/
|
||||
.card {
|
||||
flex-direction: row;
|
||||
width: 100%;
|
||||
max-width: 100%;
|
||||
justify-content: left;
|
||||
margin: var(--padding-level-1) 0;
|
||||
}
|
||||
.card-text {
|
||||
text-align: left;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 768px) {
|
||||
.profileContainer {
|
||||
max-width: 30%;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 560px) {
|
||||
.card {
|
||||
max-width: 100%;
|
||||
margin: var(--padding-level-1) 0;
|
||||
}
|
||||
.profileContainer {
|
||||
max-width: 100%;
|
||||
width: 100%;
|
||||
}
|
||||
.hide-small {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
@media only screen and (min-device-width: 360px) and (max-device-width: 736px) {
|
||||
}
|
||||
|
||||
@media only screen and (min-width: 1200px) {
|
||||
}
|
||||
|
||||
@media only screen and (max-width: 1023px) {
|
||||
.home-container {
|
||||
flex-direction: column-reverse;
|
||||
margin-top: var(--padding-level-1);
|
||||
}
|
||||
.home-text {
|
||||
align-content: center;
|
||||
text-align: center;
|
||||
max-width: 90%;
|
||||
padding-top: var(--padding-level-2);
|
||||
}
|
||||
.sample-code-container {
|
||||
max-width: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
@media only screen and (min-width: 1400px) {
|
||||
@media only screen and (min-width: 1280px) {
|
||||
}
|
||||
|
||||
@media only screen and (min-width: 1440px) {
|
||||
.landing h4.tagline-text {
|
||||
font-size: 2.25rem;
|
||||
}
|
||||
}
|
||||
|
||||
@media only screen and (min-width: 1500px) {
|
||||
}
|
||||
}
|
||||
|
18
gitlab-pages/website/static/img/easy-integration.svg
Normal file
@ -0,0 +1,18 @@
|
||||
<svg width="170" height="170" viewBox="0 0 170 170" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M142 77.7896C143.105 77.7896 144 78.685 144 79.7896V112.822C144 113.927 143.105 114.822 142 114.822H116.089C114.984 114.822 114.089 113.927 114.089 112.822V79.7895C114.089 78.685 114.984 77.7896 116.089 77.7896H142Z" fill="url(#paint0_linear)"/>
|
||||
<path d="M121.401 55C122.506 55 123.401 55.8954 123.401 57V82.911C123.401 84.0156 122.506 84.911 121.401 84.911H86.1781C85.0735 84.911 84.1781 84.0156 84.1781 82.911V57C84.1781 55.8954 85.0735 55 86.1781 55L121.401 55Z" fill="url(#paint1_linear)"/>
|
||||
<path d="M52.9111 56.0537C54.0157 56.0537 54.9111 56.9491 54.9111 58.0537L54.9111 101.76H25.0001L25.0001 58.0537C25.0001 56.9491 25.8956 56.0537 27.0001 56.0537L52.9111 56.0537Z" fill="#FC683A"/>
|
||||
<path d="M82.8218 85.9111C83.9263 85.9111 84.8218 86.8066 84.8218 87.9111V113.822C84.8218 114.927 83.9263 115.822 82.8218 115.822H48.4999L48.4999 85.9111H82.8218Z" fill="#FC683A"/>
|
||||
<path d="M54.9111 85.9111L54.9111 115.822H27.0001C25.8956 115.822 25.0001 114.927 25.0001 113.822L25.0001 85.9111H54.9111Z" fill="#FFB097"/>
|
||||
<path d="M142 55C143.105 55 144 55.8954 144 57V84.911H114.089V55L142 55Z" fill="#BDDCF9"/>
|
||||
<defs>
|
||||
<linearGradient id="paint0_linear" x1="114.51" y1="118.51" x2="143.51" y2="85.0104" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#3AA0FF"/>
|
||||
<stop offset="1" stop-color="#0072DC"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint1_linear" x1="84.5102" y1="84.5105" x2="114.51" y2="54.5105" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#3AA0FF"/>
|
||||
<stop offset="1" stop-color="#0072DC"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
</svg>
|
After Width: | Height: | Size: 1.6 KiB |
11
gitlab-pages/website/static/img/geo.svg
Normal file
@ -0,0 +1,11 @@
|
||||
<svg width="283" height="293" viewBox="0 0 283 293" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M14.5493 9.85961L22.8389 40.1643L44.2426 17.8585L14.5493 9.85961Z" fill="#FC683A"/>
|
||||
<path d="M256.608 227L215 282.348L282.301 293L256.608 227Z" fill="#EFEFEF"/>
|
||||
<circle cx="100" cy="154" r="74" stroke="url(#paint0_linear)" stroke-width="52"/>
|
||||
<defs>
|
||||
<linearGradient id="paint0_linear" x1="100" y1="54.0002" x2="100" y2="254" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#3AA0FF"/>
|
||||
<stop offset="1" stop-color="#0072DC"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
</svg>
|
After Width: | Height: | Size: 568 B |
9
gitlab-pages/website/static/img/nomadic-logo.svg
Normal file
After Width: | Height: | Size: 236 KiB |
9
gitlab-pages/website/static/img/stove-logo.svg
Normal file
After Width: | Height: | Size: 11 KiB |
16
gitlab-pages/website/static/img/strong-type-system.svg
Normal file
@ -0,0 +1,16 @@
|
||||
<svg width="170" height="170" viewBox="0 0 170 170" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<rect x="41" y="55" width="102" height="72" rx="2" fill="url(#paint0_linear)"/>
|
||||
<rect x="27" y="41" width="102" height="72" rx="2" fill="url(#paint1_linear)"/>
|
||||
<circle cx="77" cy="77" r="21" fill="white"/>
|
||||
<path d="M67 76.8868L74.0732 84L87 71" stroke="#FC683A" stroke-width="5" stroke-linecap="square"/>
|
||||
<defs>
|
||||
<linearGradient id="paint0_linear" x1="41" y1="91" x2="143" y2="91" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#BFDCF6"/>
|
||||
<stop offset="1" stop-color="#CEE7FF"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint1_linear" x1="129" y1="77" x2="27" y2="77" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#3AA0FF"/>
|
||||
<stop offset="1" stop-color="#0072DC"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
</svg>
|
After Width: | Height: | Size: 801 B |
25
gitlab-pages/website/static/img/syntax-agnostic.svg
Normal file
@ -0,0 +1,25 @@
|
||||
<svg width="170" height="170" viewBox="0 0 170 170" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M35 46C35 44.8954 35.8954 44 37 44H132.493C133.597 44 134.493 44.8954 134.493 46V120C134.493 121.105 133.597 122 132.493 122H37C35.8954 122 35 121.105 35 120V46Z" fill="url(#paint0_linear)"/>
|
||||
<path d="M116.234 94.5L108.772 102L101.31 94.5L93.8478 102L86.3858 94.5L78.9239 102L71.4619 94.5L64 102" stroke="white" stroke-width="5" stroke-linejoin="round"/>
|
||||
<path d="M35 46C35 44.8954 35.8954 44 37 44H132.493C133.597 44 134.493 44.8954 134.493 46V63H35V46Z" fill="url(#paint1_linear)" fill-opacity="0.45"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M162.791 66.3737L155.281 55.9843L113.934 86.1776L121.444 96.5669L162.791 66.3737ZM109.936 97.0332L113.933 86.1772L121.443 96.5666L109.936 97.0332Z" fill="#0D0F33"/>
|
||||
<mask id="mask0" mask-type="alpha" maskUnits="userSpaceOnUse" x="109" y="55" width="54" height="43">
|
||||
<mask id="path-5-inside-1" mask-type="luminance" fill="white">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M162.791 66.3739L155.281 55.9846L113.934 86.1778L121.444 96.5672L162.791 66.3739ZM109.936 97.0334L113.933 86.1775L121.443 96.5668L109.936 97.0334Z"/>
|
||||
</mask>
|
||||
<path d="M155.281 55.9846L197.219 25.359L166.716 -16.8401L124.777 13.7855L155.281 55.9846ZM162.791 66.3739L193.295 108.573L235.233 77.9474L204.729 35.7483L162.791 66.3739ZM113.934 86.1778L83.4304 43.9788L41.4918 74.6043L71.9957 116.803L113.934 86.1778ZM121.444 96.5672L79.5057 127.193L110.009 169.392L151.948 138.766L121.444 96.5672ZM113.933 86.1775L155.872 55.5519L98.9098 -23.2495L65.2984 68.0288L113.933 86.1775ZM109.936 97.0334L61.3009 78.8847L34.2721 152.287L112.08 149.132L109.936 97.0334ZM121.443 96.5668L123.587 148.666L220.344 144.743L163.382 65.9413L121.443 96.5668ZM113.342 86.6101L120.852 96.9995L204.729 35.7483L197.219 25.359L113.342 86.6101ZM144.438 128.377L185.785 98.1836L124.777 13.7855L83.4304 43.9788L144.438 128.377ZM163.383 65.9416L155.873 55.5522L71.9957 116.803L79.5057 127.193L163.383 65.9416ZM132.287 24.1749L90.9404 54.3681L151.948 138.766L193.295 108.573L132.287 24.1749ZM65.2984 68.0288L61.3009 78.8847L158.571 115.182L162.568 104.326L65.2984 68.0288ZM163.382 65.9413L155.872 55.5519L71.9947 116.803L79.5047 127.192L163.382 65.9413ZM112.08 149.132L123.587 148.666L119.299 44.4681L107.792 44.9347L112.08 149.132Z" fill="#FC683A" mask="url(#path-5-inside-1)"/>
|
||||
</mask>
|
||||
<g mask="url(#mask0)">
|
||||
<rect width="51.8377" height="35.1415" transform="matrix(0.593657 0.806374 -0.801338 0.595984 163.06 30.3345)" fill="#FC683A"/>
|
||||
</g>
|
||||
<defs>
|
||||
<linearGradient id="paint0_linear" x1="134.493" y1="90" x2="35" y2="90" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#3AA0FF"/>
|
||||
<stop offset="1" stop-color="#0072DC"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint1_linear" x1="35" y1="53.5" x2="134.493" y2="53.5" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#BFDCF6"/>
|
||||
<stop offset="1" stop-color="#CEE7FF"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
</svg>
|
After Width: | Height: | Size: 2.9 KiB |
17
gitlab-pages/website/static/img/tq-logo-2.svg
Normal file
@ -0,0 +1,17 @@
|
||||
<svg width="108" height="66" viewBox="0 0 108 66" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<g opacity="0.3" clip-path="url(#clip0)">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M73.9777 1.32883C56.4584 1.32883 42.2529 15.6534 42.2529 33.318C42.2529 50.9901 56.4584 65.3134 73.9777 65.3134C74.3753 65.3134 74.7717 65.3071 75.1631 65.2873V54.3835C74.7717 54.4034 74.3753 54.4158 73.9777 54.4158C62.4225 54.4158 53.0535 44.9687 53.0535 33.318C53.0535 21.6723 62.4213 12.2251 73.9777 12.2251C85.0257 12.2251 94.0734 20.8645 94.8489 31.8018H105.675C104.888 14.8382 91.0021 1.32883 73.9777 1.32883Z" fill="black"/>
|
||||
<mask id="mask0" mask-type="alpha" maskUnits="userSpaceOnUse" x="41" y="0" width="66" height="66">
|
||||
<path d="M41.7949 0.866028H106.157V65.7749H41.7949V0.866028Z" fill="black"/>
|
||||
</mask>
|
||||
<g mask="url(#mask0)">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M73.9776 1.79015C56.7377 1.79015 42.7132 15.9347 42.7132 33.3177C42.7132 50.7044 56.7365 64.849 73.9776 64.849C74.2201 64.849 74.4626 64.849 74.7038 64.8403V54.8647C74.4626 54.8733 74.2201 54.8783 73.9776 54.8783C62.1873 54.8783 52.5955 45.2054 52.5955 33.3177C52.5955 21.4313 62.1873 11.7621 73.9776 11.7621C84.9997 11.7621 94.2715 20.327 95.271 31.3387H105.193C104.17 14.73 90.5527 1.79015 73.9763 1.79015H73.9776ZM73.9763 65.7734C56.233 65.7758 41.7949 51.2144 41.7949 33.3177C41.7949 15.4248 56.233 0.867027 73.9776 0.867027C91.2039 0.867027 105.328 14.4458 106.133 31.7804L106.158 32.2643H94.4216L94.3909 31.835C93.6301 21.0963 84.6649 12.6877 73.9776 12.6877C62.6932 12.6877 53.5126 21.94 53.5126 33.3177C53.5126 44.6954 62.6932 53.9527 73.9776 53.9527C74.3666 53.9527 74.7568 53.9403 75.1396 53.9204L75.6197 53.8969V65.7262L75.1852 65.7486C74.7876 65.7684 74.3826 65.7746 73.9788 65.7746" fill="black"/>
|
||||
</g>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M0.713867 0.945824H74.2893V11.5481H32.6282V65.0259H21.1899V11.5481H0.713867V0.945824ZM91.5131 43.2978L85.7399 50.643L101.594 63.8831L107.374 56.6942L91.5131 43.2978Z" fill="black"/>
|
||||
</g>
|
||||
<defs>
|
||||
<clipPath id="clip0">
|
||||
<rect width="107.095" height="65.76" fill="white" transform="translate(0.713867 0.0781555)"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
</svg>
|
After Width: | Height: | Size: 2.1 KiB |
Before Width: | Height: | Size: 11 KiB |
17
gitlab-pages/website/static/img/user.svg
Normal file
@ -0,0 +1,17 @@
|
||||
<svg width="195" height="195" viewBox="0 0 195 195" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<rect width="195" height="195" rx="2" fill="#EBF6FF"/>
|
||||
<mask id="mask0" mask-type="alpha" maskUnits="userSpaceOnUse" x="0" y="0" width="195" height="195">
|
||||
<rect width="195" height="195" rx="2" fill="#EFEFEF"/>
|
||||
</mask>
|
||||
<g mask="url(#mask0)">
|
||||
<g opacity="0.66">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M96.8828 136.001C117.493 136.001 134.2 117.205 134.2 94.0192C134.2 70.8332 117.493 52.0371 96.8828 52.0371C76.2729 52.0371 59.5653 70.8332 59.5653 94.0192C59.5653 117.205 76.2729 136.001 96.8828 136.001ZM74.6715 144C40.8717 144 14.2319 172.785 16.8451 206.484L22.1944 275.469C22.9616 285.363 31.2138 293 41.1375 293H153.862C163.786 293 172.038 285.363 172.805 275.469L178.155 206.484C180.768 172.785 154.128 144 120.328 144H74.6715Z" fill="url(#paint0_linear)"/>
|
||||
</g>
|
||||
</g>
|
||||
<defs>
|
||||
<linearGradient id="paint0_linear" x1="97.9998" y1="215.5" x2="97.9998" y2="25.9999" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#A5D4FF"/>
|
||||
<stop offset="1" stop-color="#D3EAFF"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
</svg>
|
After Width: | Height: | Size: 1.1 KiB |
@ -37,7 +37,8 @@
|
||||
},
|
||||
"version-next-tutorials": {
|
||||
"Get Started": [
|
||||
"version-next-tutorials/get-started/tezos-taco-shop-smart-contract"
|
||||
"version-next-tutorials/get-started/tezos-taco-shop-smart-contract",
|
||||
"version-next-tutorials/get-started/tezos-taco-shop-payout"
|
||||
]
|
||||
}
|
||||
}
|
||||
|
@ -10,7 +10,7 @@ license: "MIT"
|
||||
depends: [
|
||||
"ocamlfind" { build }
|
||||
"dune" { build & >= "1.0.1" }
|
||||
"menhir"
|
||||
"menhir" { = "20190626" }
|
||||
"ppx_let"
|
||||
"ppx_deriving"
|
||||
"tezos-utils"
|
||||
|
@ -48,7 +48,8 @@ let compile_contract_entry = fun program name ->
|
||||
in
|
||||
let%bind param_michelson = Compiler.Type.type_ param_ty in
|
||||
let%bind storage_michelson = Compiler.Type.type_ storage_ty in
|
||||
let contract = Michelson.contract param_michelson storage_michelson compiled.body in
|
||||
let body = Michelson.strip_annots compiled.body in
|
||||
let contract = Michelson.contract param_michelson storage_michelson body in
|
||||
ok contract
|
||||
|
||||
|
||||
|
@ -24,7 +24,7 @@ let run ?options (* ?(is_input_value = false) *) (program:compiled_program) (inp
|
||||
Trace.trace_tzresult_lwt (simple_error "error parsing input") @@
|
||||
Memory_proto_alpha.parse_michelson_data input_michelson input_ty
|
||||
in
|
||||
let body = Michelson.(strip_nops @@ strip_annots body) in
|
||||
let body = Michelson.strip_annots body in
|
||||
let%bind descr =
|
||||
Trace.trace_tzresult_lwt (simple_error "error parsing program code") @@
|
||||
Memory_proto_alpha.parse_michelson body
|
||||
|
@ -276,7 +276,7 @@ rule scan = parse
|
||||
|
||||
| integer as n { Token.Int (n, Z.of_string n) }
|
||||
| integer as n "p" { Token.Nat (n ^ "p", Z.of_string n) }
|
||||
| integer as tz "tz" { Token.Mtz (tz ^ "tz", Z.of_string tz) }
|
||||
| integer as tz "tz" { Token.Mtz (tz ^ "tz", Z.mul (Z.of_int 1_000_000) (Z.of_string tz)) }
|
||||
| decimal as tz "tz" {
|
||||
match format_tz tz with
|
||||
Some z -> Token.Mtz (tz ^ "tz", z)
|
||||
|
@ -312,7 +312,6 @@ and single_instr =
|
||||
| Assign of assignment reg
|
||||
| Loop of loop
|
||||
| ProcCall of fun_call
|
||||
| Fail of fail_instr reg
|
||||
| Skip of kwd_skip
|
||||
| RecordPatch of record_patch reg
|
||||
| MapPatch of map_patch reg
|
||||
@ -363,11 +362,6 @@ and record_patch = {
|
||||
record_inj : record_expr
|
||||
}
|
||||
|
||||
and fail_instr = {
|
||||
kwd_fail : kwd_fail;
|
||||
fail_expr : expr
|
||||
}
|
||||
|
||||
and conditional = {
|
||||
kwd_if : kwd_if;
|
||||
test : expr;
|
||||
@ -726,7 +720,6 @@ let instr_to_region = function
|
||||
| Single Loop For ForCollect {region; _}
|
||||
| Single ProcCall {region; _}
|
||||
| Single Skip region
|
||||
| Single Fail {region; _}
|
||||
| Single RecordPatch {region; _}
|
||||
| Single MapPatch {region; _}
|
||||
| Single SetPatch {region; _}
|
||||
|
@ -296,7 +296,6 @@ and single_instr =
|
||||
| Assign of assignment reg
|
||||
| Loop of loop
|
||||
| ProcCall of fun_call
|
||||
| Fail of fail_instr reg
|
||||
| Skip of kwd_skip
|
||||
| RecordPatch of record_patch reg
|
||||
| MapPatch of map_patch reg
|
||||
@ -347,11 +346,6 @@ and record_patch = {
|
||||
record_inj : field_assign reg injection reg
|
||||
}
|
||||
|
||||
and fail_instr = {
|
||||
kwd_fail : kwd_fail;
|
||||
fail_expr : expr
|
||||
}
|
||||
|
||||
and conditional = {
|
||||
kwd_if : kwd_if;
|
||||
test : expr;
|
||||
|
@ -401,7 +401,6 @@ single_instr:
|
||||
| assignment { Assign $1 }
|
||||
| loop { Loop $1 }
|
||||
| proc_call { ProcCall $1 }
|
||||
| fail_instr { Fail $1 }
|
||||
| Skip { Skip $1 }
|
||||
| record_patch { RecordPatch $1 }
|
||||
| map_patch { MapPatch $1 }
|
||||
@ -511,12 +510,6 @@ record_patch:
|
||||
record_inj = $4}
|
||||
in {region; value}}
|
||||
|
||||
fail_instr:
|
||||
Fail expr {
|
||||
let region = cover $1 (expr_to_region $2)
|
||||
and value = {kwd_fail = $1; fail_expr = $2}
|
||||
in {region; value}}
|
||||
|
||||
proc_call:
|
||||
fun_call { $1 }
|
||||
|
||||
|
@ -252,7 +252,6 @@ and print_single_instr = function
|
||||
| Assign assign -> print_assignment assign
|
||||
| Loop loop -> print_loop loop
|
||||
| ProcCall fun_call -> print_fun_call fun_call
|
||||
| Fail {value; _} -> print_fail value
|
||||
| Skip kwd_skip -> print_token kwd_skip "skip"
|
||||
| RecordPatch {value; _} -> print_record_patch value
|
||||
| MapPatch {value; _} -> print_map_patch value
|
||||
@ -260,10 +259,6 @@ and print_single_instr = function
|
||||
| MapRemove {value; _} -> print_map_remove value
|
||||
| SetRemove {value; _} -> print_set_remove value
|
||||
|
||||
and print_fail {kwd_fail; fail_expr} =
|
||||
print_token kwd_fail "fail";
|
||||
print_expr fail_expr
|
||||
|
||||
and print_conditional node =
|
||||
let {kwd_if; test; kwd_then; ifso; terminator;
|
||||
kwd_else; ifnot} = node in
|
||||
|
@ -763,10 +763,6 @@ and simpl_single_instruction : Raw.single_instr -> (_ -> expression result) resu
|
||||
let%bind lst = bind_map_list simpl_expression args' in
|
||||
return_statement @@ e_constant ~loc s lst
|
||||
)
|
||||
| Fail e -> (
|
||||
let%bind expr = simpl_expression e.value.fail_expr in
|
||||
return_statement @@ e_failwith expr
|
||||
)
|
||||
| Skip reg -> (
|
||||
let loc = Location.lift reg in
|
||||
return_statement @@ e_skip ~loc ()
|
||||
|
@ -45,10 +45,6 @@ let rec map_expression : mapper -> expression -> expression result = fun f e ->
|
||||
let%bind path' = map_path f path in
|
||||
return @@ E_assign (name , path' , e')
|
||||
)
|
||||
| E_failwith e -> (
|
||||
let%bind e' = self e in
|
||||
return @@ E_failwith e'
|
||||
)
|
||||
| E_matching (e , cases) -> (
|
||||
let%bind e' = self e in
|
||||
let%bind cases' = map_cases f cases in
|
||||
|
@ -396,7 +396,6 @@ and type_expression : environment -> ?tv_opt:O.type_value -> I.expression -> O.a
|
||||
trace main_error @@
|
||||
match ae.expression with
|
||||
(* Basic *)
|
||||
| E_failwith _ -> fail @@ needs_annotation ae "the failwith keyword"
|
||||
| E_variable name ->
|
||||
let%bind tv' =
|
||||
trace_option (unbound_variable e name ae.location)
|
||||
@ -645,54 +644,27 @@ and type_expression : environment -> ?tv_opt:O.type_value -> I.expression -> O.a
|
||||
(* Advanced *)
|
||||
| E_matching (ex, m) -> (
|
||||
let%bind ex' = type_expression e ex in
|
||||
match m with
|
||||
(* Special case for assert-like failwiths. TODO: CLEAN THIS. *)
|
||||
| I.Match_bool { match_false ; match_true } when I.is_e_failwith match_true -> (
|
||||
let%bind fw = I.get_e_failwith match_true in
|
||||
let%bind fw' = type_expression e fw in
|
||||
let%bind mf' = type_expression e match_false in
|
||||
let t = get_type_annotation ex' in
|
||||
let%bind () =
|
||||
trace_strong (match_error ~expected:m ~actual:t ae.location)
|
||||
@@ assert_t_bool t in
|
||||
let%bind () =
|
||||
trace_strong (match_error
|
||||
~msg:"matching not-unit on an assert"
|
||||
~expected:m
|
||||
~actual:t
|
||||
ae.location)
|
||||
@@ assert_t_unit (get_type_annotation mf') in
|
||||
let mt' = make_a_e
|
||||
(E_constant ("ASSERT_INFERRED" , [ex' ; fw']))
|
||||
(t_unit ())
|
||||
e
|
||||
in
|
||||
let m' = O.Match_bool { match_true = mt' ; match_false = mf' } in
|
||||
return (O.E_matching (ex' , m')) (t_unit ())
|
||||
)
|
||||
| _ -> (
|
||||
let%bind m' = type_match (type_expression ?tv_opt:None) e ex'.type_annotation m ae ae.location in
|
||||
let tvs =
|
||||
let aux (cur:O.value O.matching) =
|
||||
match cur with
|
||||
| Match_bool { match_true ; match_false } -> [ match_true ; match_false ]
|
||||
| Match_list { match_nil ; match_cons = ((_ , _) , match_cons) } -> [ match_nil ; match_cons ]
|
||||
| Match_option { match_none ; match_some = (_ , match_some) } -> [ match_none ; match_some ]
|
||||
| Match_tuple (_ , match_tuple) -> [ match_tuple ]
|
||||
| Match_variant (lst , _) -> List.map snd lst in
|
||||
List.map get_type_annotation @@ aux m' in
|
||||
let aux prec cur =
|
||||
let%bind () =
|
||||
match prec with
|
||||
| None -> ok ()
|
||||
| Some cur' -> Ast_typed.assert_type_value_eq (cur , cur') in
|
||||
ok (Some cur) in
|
||||
let%bind tv_opt = bind_fold_list aux None tvs in
|
||||
let%bind tv =
|
||||
trace_option (match_empty_variant m ae.location) @@
|
||||
tv_opt in
|
||||
return (O.E_matching (ex', m')) tv
|
||||
)
|
||||
let%bind m' = type_match (type_expression ?tv_opt:None) e ex'.type_annotation m ae ae.location in
|
||||
let tvs =
|
||||
let aux (cur:O.value O.matching) =
|
||||
match cur with
|
||||
| Match_bool { match_true ; match_false } -> [ match_true ; match_false ]
|
||||
| Match_list { match_nil ; match_cons = ((_ , _) , match_cons) } -> [ match_nil ; match_cons ]
|
||||
| Match_option { match_none ; match_some = (_ , match_some) } -> [ match_none ; match_some ]
|
||||
| Match_tuple (_ , match_tuple) -> [ match_tuple ]
|
||||
| Match_variant (lst , _) -> List.map snd lst in
|
||||
List.map get_type_annotation @@ aux m' in
|
||||
let aux prec cur =
|
||||
let%bind () =
|
||||
match prec with
|
||||
| None -> ok ()
|
||||
| Some cur' -> Ast_typed.assert_type_value_eq (cur , cur') in
|
||||
ok (Some cur) in
|
||||
let%bind tv_opt = bind_fold_list aux None tvs in
|
||||
let%bind tv =
|
||||
trace_option (match_empty_variant m ae.location) @@
|
||||
tv_opt in
|
||||
return (O.E_matching (ex', m')) tv
|
||||
)
|
||||
| E_sequence (a , b) ->
|
||||
let%bind a' = type_expression e a in
|
||||
@ -868,9 +840,6 @@ let rec untype_expression (e:O.annotated_expression) : (I.expression) result =
|
||||
let%bind ae' = untype_expression ae in
|
||||
let%bind m' = untype_matching untype_expression m in
|
||||
return (e_matching ae' m')
|
||||
| E_failwith ae ->
|
||||
let%bind ae' = untype_expression ae in
|
||||
return (e_failwith ae')
|
||||
| E_sequence _
|
||||
| E_loop _
|
||||
| E_assign _ -> fail @@ not_supported_yet_untranspile "not possible to untranspile statements yet" e.expression
|
||||
|
@ -56,7 +56,7 @@ them. please report this to the developers." in
|
||||
|
||||
let bad_big_map location =
|
||||
let title () = "bad arguments for main" in
|
||||
let content () = "only one big_map per program which must appear
|
||||
let content () = "only one big_map per program which must appear
|
||||
on the left hand side of a pair in the contract's storage" in
|
||||
let data = [
|
||||
("location" , fun () -> Format.asprintf "%a" Location.pp location) ;
|
||||
@ -131,28 +131,39 @@ let rec transpile_type (t:AST.type_value) : type_value result =
|
||||
let%bind o' = transpile_type o in
|
||||
ok (T_option o')
|
||||
| T_constant (name , _lst) -> fail @@ unrecognized_type_constant name
|
||||
(* TODO hmm *)
|
||||
| T_sum m ->
|
||||
let node = Append_tree.of_list @@ list_of_map m in
|
||||
let aux a b : type_value result =
|
||||
let node = Append_tree.of_list @@ kv_list_of_map m in
|
||||
let aux a b : type_value annotated result =
|
||||
let%bind a = a in
|
||||
let%bind b = b in
|
||||
ok (T_or (a, b))
|
||||
ok (None, T_or (a, b))
|
||||
in
|
||||
Append_tree.fold_ne transpile_type aux node
|
||||
let%bind m' = Append_tree.fold_ne
|
||||
(fun (ann, a) ->
|
||||
let%bind a = transpile_type a in
|
||||
ok (Some (String.uncapitalize_ascii ann), a))
|
||||
aux node in
|
||||
ok @@ snd m'
|
||||
| T_record m ->
|
||||
let node = Append_tree.of_list @@ list_of_map m in
|
||||
let aux a b : type_value result =
|
||||
let node = Append_tree.of_list @@ kv_list_of_map m in
|
||||
let aux a b : type_value annotated result =
|
||||
let%bind a = a in
|
||||
let%bind b = b in
|
||||
ok (T_pair (a, b))
|
||||
ok (None, T_pair (a, b))
|
||||
in
|
||||
Append_tree.fold_ne transpile_type aux node
|
||||
let%bind m' = Append_tree.fold_ne
|
||||
(fun (ann, a) ->
|
||||
let%bind a = transpile_type a in
|
||||
ok (Some ann, a))
|
||||
aux node in
|
||||
ok @@ snd m'
|
||||
| T_tuple lst ->
|
||||
let node = Append_tree.of_list lst in
|
||||
let aux a b : type_value result =
|
||||
let%bind a = a in
|
||||
let%bind b = b in
|
||||
ok (T_pair (a, b))
|
||||
ok (T_pair ((None, a), (None, b)))
|
||||
in
|
||||
Append_tree.fold_ne transpile_type aux node
|
||||
| T_function (param, result) -> (
|
||||
@ -253,10 +264,6 @@ and transpile_annotated_expression (ae:AST.annotated_expression) : expression re
|
||||
let%bind rhs' = transpile_annotated_expression rhs in
|
||||
let%bind result' = transpile_annotated_expression result in
|
||||
return (E_let_in ((binder, rhs'.type_value), rhs', result'))
|
||||
| E_failwith ae -> (
|
||||
let%bind ae' = transpile_annotated_expression ae in
|
||||
return @@ E_constant ("FAILWITH" , [ae'])
|
||||
)
|
||||
| E_literal l -> return @@ E_literal (transpile_literal l)
|
||||
| E_variable name -> (
|
||||
let%bind ele =
|
||||
@ -289,10 +296,10 @@ and transpile_annotated_expression (ae:AST.annotated_expression) : expression re
|
||||
let%bind a = a in
|
||||
let%bind b = b in
|
||||
match (a, b) with
|
||||
| (None, a), (None, b) -> ok (None, T_or (a, b))
|
||||
| (None, a), (None, b) -> ok (None, T_or ((None, a), (None, b)))
|
||||
| (Some _, _), (Some _, _) -> fail @@ corner_case ~loc:__LOC__ "multiple identical constructors in the same variant"
|
||||
| (Some v, a), (None, b) -> ok (Some (E_constant ("LEFT", [Combinators.Expression.make_tpl (v, a)])), T_or (a, b))
|
||||
| (None, a), (Some v, b) -> ok (Some (E_constant ("RIGHT", [Combinators.Expression.make_tpl (v, b)])), T_or (a, b))
|
||||
| (Some v, a), (None, b) -> ok (Some (E_constant ("LEFT", [Combinators.Expression.make_tpl (v, a)])), T_or ((None, a), (None, b)))
|
||||
| (None, a), (Some v, b) -> ok (Some (E_constant ("RIGHT", [Combinators.Expression.make_tpl (v, b)])), T_or ((None, a), (None, b)))
|
||||
in
|
||||
let%bind (ae_opt, tv) = Append_tree.fold_ne leaf node node_tv in
|
||||
let%bind ae =
|
||||
@ -307,7 +314,7 @@ and transpile_annotated_expression (ae:AST.annotated_expression) : expression re
|
||||
let%bind b = b in
|
||||
let a_ty = Combinators.Expression.get_type a in
|
||||
let b_ty = Combinators.Expression.get_type b in
|
||||
let tv = T_pair (a_ty , b_ty) in
|
||||
let tv = T_pair ((None, a_ty) , (None, b_ty)) in
|
||||
return ~tv @@ E_constant ("PAIR", [a; b])
|
||||
in
|
||||
Append_tree.fold_ne (transpile_annotated_expression) aux node
|
||||
@ -337,7 +344,7 @@ and transpile_annotated_expression (ae:AST.annotated_expression) : expression re
|
||||
let%bind b = b in
|
||||
let a_ty = Combinators.Expression.get_type a in
|
||||
let b_ty = Combinators.Expression.get_type b in
|
||||
let tv = T_pair (a_ty , b_ty) in
|
||||
let tv = T_pair ((None, a_ty) , (None, b_ty)) in
|
||||
return ~tv @@ E_constant ("PAIR", [a; b])
|
||||
in
|
||||
trace_strong (corner_case ~loc:__LOC__ "record build") @@
|
||||
@ -555,7 +562,7 @@ and transpile_annotated_expression (ae:AST.annotated_expression) : expression re
|
||||
| Node {a ; b} ->
|
||||
let%bind a' = aux a in
|
||||
let%bind b' = aux b in
|
||||
let tv' = Mini_c.t_union (snd a') (snd b') in
|
||||
let tv' = Mini_c.t_union (None, snd a') (None, snd b') in
|
||||
ok (`Node (a' , b') , tv')
|
||||
in aux tree'
|
||||
in
|
||||
@ -648,8 +655,8 @@ let check_storage f ty loc : (anon_function * _) result =
|
||||
let rec aux (t:type_value) on_big_map =
|
||||
match t with
|
||||
| T_big_map _ -> on_big_map
|
||||
| T_pair (a , b) -> (aux a true) && (aux b false)
|
||||
| T_or (a,b) -> (aux a false) && (aux b false)
|
||||
| T_pair (a , b) -> (aux (snd a) true) && (aux (snd b) false)
|
||||
| T_or (a,b) -> (aux (snd a) false) && (aux (snd b) false)
|
||||
| T_function (a,b) -> (aux a false) && (aux b false)
|
||||
| T_deep_closure (_,a,b) -> (aux a false) && (aux b false)
|
||||
| T_map (a,b) -> (aux a false) && (aux b false)
|
||||
@ -661,7 +668,7 @@ let check_storage f ty loc : (anon_function * _) result =
|
||||
in
|
||||
match f.body.type_value with
|
||||
| T_pair (_, storage) ->
|
||||
if aux storage false then ok (f, ty) else fail @@ bad_big_map loc
|
||||
if aux (snd storage) false then ok (f, ty) else fail @@ bad_big_map loc
|
||||
| _ -> ok (f, ty)
|
||||
|
||||
let extract_constructor (v : value) (tree : _ Append_tree.t') : (string * value * AST.type_value) result =
|
||||
|
@ -43,6 +43,13 @@ module Ty = struct
|
||||
let pair a b = Pair_t ((a, None, None), (b, None, None), None)
|
||||
let union a b = Union_t ((a, None), (b, None), None)
|
||||
|
||||
let field_annot = Option.map (fun ann -> `Field_annot ann)
|
||||
|
||||
let union_ann (anna, a) (annb, b) =
|
||||
Union_t ((a, field_annot anna), (b, field_annot annb), None)
|
||||
|
||||
let pair_ann (anna, a) (annb, b) =
|
||||
Pair_t ((a, field_annot anna, None), (b, field_annot annb, None), None)
|
||||
|
||||
let not_comparable name () = error (thunk "not a comparable type") (fun () -> name) ()
|
||||
let not_compilable_type name () = error (thunk "not a compilable type") (fun () -> name) ()
|
||||
@ -95,14 +102,14 @@ module Ty = struct
|
||||
function
|
||||
| T_base b -> base_type b
|
||||
| T_pair (t, t') -> (
|
||||
type_ t >>? fun (Ex_ty t) ->
|
||||
type_ t' >>? fun (Ex_ty t') ->
|
||||
ok @@ Ex_ty (pair t t')
|
||||
annotated t >>? fun (ann, Ex_ty t) ->
|
||||
annotated t' >>? fun (ann', Ex_ty t') ->
|
||||
ok @@ Ex_ty (pair_ann (ann, t) (ann', t'))
|
||||
)
|
||||
| T_or (t, t') -> (
|
||||
type_ t >>? fun (Ex_ty t) ->
|
||||
type_ t' >>? fun (Ex_ty t') ->
|
||||
ok @@ Ex_ty (union t t')
|
||||
annotated t >>? fun (ann, Ex_ty t) ->
|
||||
annotated t' >>? fun (ann', Ex_ty t') ->
|
||||
ok @@ Ex_ty (union_ann (ann, t) (ann', t'))
|
||||
)
|
||||
| T_function (arg, ret) ->
|
||||
let%bind (Ex_ty arg) = type_ arg in
|
||||
@ -135,6 +142,10 @@ module Ty = struct
|
||||
let%bind (Ex_ty t') = type_ t in
|
||||
ok @@ Ex_ty (contract t')
|
||||
|
||||
and annotated : type_value annotated -> ex_ty annotated result =
|
||||
fun (ann, a) -> let%bind a = type_ a in
|
||||
ok @@ (ann, a)
|
||||
|
||||
and environment_representation = fun e ->
|
||||
match List.rev_uncons_opt e with
|
||||
| None -> ok @@ Ex_ty unit
|
||||
@ -177,13 +188,13 @@ let rec type_ : type_value -> O.michelson result =
|
||||
function
|
||||
| T_base b -> base_type b
|
||||
| T_pair (t, t') -> (
|
||||
type_ t >>? fun t ->
|
||||
type_ t' >>? fun t' ->
|
||||
annotated t >>? fun t ->
|
||||
annotated t' >>? fun t' ->
|
||||
ok @@ O.prim ~children:[t;t'] O.T_pair
|
||||
)
|
||||
| T_or (t, t') -> (
|
||||
type_ t >>? fun t ->
|
||||
type_ t' >>? fun t' ->
|
||||
annotated t >>? fun t ->
|
||||
annotated t' >>? fun t' ->
|
||||
ok @@ O.prim ~children:[t;t'] O.T_or
|
||||
)
|
||||
| T_map kv ->
|
||||
@ -213,6 +224,13 @@ let rec type_ : type_value -> O.michelson result =
|
||||
let%bind lambda = lambda_closure (c , arg , ret) in
|
||||
ok @@ O.t_pair lambda capture
|
||||
|
||||
and annotated : type_value annotated -> O.michelson result =
|
||||
function
|
||||
| (Some ann, o) ->
|
||||
let%bind o' = type_ o in
|
||||
ok (O.annotate ("%" ^ ann) o')
|
||||
| (None, o) -> type_ o
|
||||
|
||||
and environment_element (name, tyv) =
|
||||
let%bind michelson_type = type_ tyv in
|
||||
ok @@ O.annotate ("@" ^ name) michelson_type
|
||||
|
@ -312,11 +312,12 @@ module Typer = struct
|
||||
then ok @@ t_bytes ()
|
||||
else simple_fail "bad slice"
|
||||
|
||||
let failwith_ = typer_1 "FAILWITH" @@ fun t ->
|
||||
let failwith_ = typer_1_opt "FAILWITH" @@ fun t opt ->
|
||||
let%bind () =
|
||||
Assert.assert_true @@
|
||||
(is_t_string t) in
|
||||
ok @@ t_unit ()
|
||||
let default = t_unit () in
|
||||
ok @@ Simple_utils.Option.unopt ~default opt
|
||||
|
||||
let map_get_force = typer_2 "MAP_GET_FORCE" @@ fun i m ->
|
||||
let%bind (src, dst) = bind_map_or (get_t_map , get_t_big_map) m in
|
||||
|
@ -52,8 +52,6 @@ let rec expression ppf (e:expression) = match e.expression with
|
||||
expression result
|
||||
| E_matching (ae, m) ->
|
||||
fprintf ppf "match %a with %a" expression ae (matching expression) m
|
||||
| E_failwith ae ->
|
||||
fprintf ppf "failwith %a" expression ae
|
||||
| E_sequence (a , b) ->
|
||||
fprintf ppf "%a ; %a"
|
||||
expression a
|
||||
|
@ -84,7 +84,6 @@ let e_matching_bool ?loc a b c : expression = e_matching ?loc a (Match_bool {mat
|
||||
let e_accessor ?loc a b = location_wrap ?loc @@ E_accessor (a , b)
|
||||
let e_accessor_props ?loc a b = e_accessor ?loc a (List.map (fun x -> Access_record x) b)
|
||||
let e_variable ?loc v = location_wrap ?loc @@ E_variable v
|
||||
let e_failwith ?loc v = location_wrap ?loc @@ E_failwith v
|
||||
let e_skip ?loc () = location_wrap ?loc @@ E_skip
|
||||
let e_loop ?loc cond body = location_wrap ?loc @@ E_loop (cond , body)
|
||||
let e_sequence ?loc a b = location_wrap ?loc @@ E_sequence (a , b)
|
||||
@ -167,13 +166,6 @@ let get_e_tuple = fun t ->
|
||||
| E_tuple lst -> ok lst
|
||||
| _ -> simple_fail "not a tuple"
|
||||
|
||||
let get_e_failwith = fun e ->
|
||||
match e.expression with
|
||||
| E_failwith fw -> ok fw
|
||||
| _ -> simple_fail "not a failwith"
|
||||
|
||||
let is_e_failwith e = to_bool @@ get_e_failwith e
|
||||
|
||||
let extract_pair : expression -> (expression * expression) result = fun e ->
|
||||
match e.expression with
|
||||
| E_tuple [ a ; b ] -> ok (a , b)
|
||||
|
@ -163,7 +163,7 @@ let rec assert_value_eq (a, b: (expression * expression )) : unit result =
|
||||
| (E_variable _, _) | (E_lambda _, _)
|
||||
| (E_application _, _) | (E_let_in _, _)
|
||||
| (E_accessor _, _)
|
||||
| (E_look_up _, _) | (E_matching _, _) | (E_failwith _, _) | (E_sequence _, _)
|
||||
| (E_look_up _, _) | (E_matching _, _) | (E_sequence _, _)
|
||||
| (E_loop _, _) | (E_assign _, _) | (E_skip, _) -> simple_fail "comparing not a value"
|
||||
|
||||
let is_value_eq (a , b) = to_bool @@ assert_value_eq (a , b)
|
||||
|
@ -65,7 +65,6 @@ and expression' =
|
||||
| E_look_up of (expr * expr)
|
||||
(* Matching *)
|
||||
| E_matching of (expr * matching_expr)
|
||||
| E_failwith of expr
|
||||
(* Replace Statements *)
|
||||
| E_sequence of (expr * expr)
|
||||
| E_loop of (expr * expr)
|
||||
|
@ -47,7 +47,6 @@ and expression ppf (e:expression) : unit =
|
||||
| E_look_up (ds, i) -> fprintf ppf "(%a)[%a]" annotated_expression ds annotated_expression i
|
||||
| E_matching (ae, m) ->
|
||||
fprintf ppf "match %a with %a" annotated_expression ae (matching annotated_expression) m
|
||||
| E_failwith ae -> fprintf ppf "failwith %a" annotated_expression ae
|
||||
| E_sequence (a , b) -> fprintf ppf "%a ; %a" annotated_expression a annotated_expression b
|
||||
| E_loop (expr , body) -> fprintf ppf "while %a { %a }" annotated_expression expr annotated_expression body
|
||||
| E_assign (name , path , expr) ->
|
||||
|
@ -176,7 +176,6 @@ module Free_variables = struct
|
||||
| (E_map m | E_big_map m) -> unions @@ List.map self @@ List.concat @@ List.map (fun (a, b) -> [ a ; b ]) m
|
||||
| E_look_up (a , b) -> unions @@ List.map self [ a ; b ]
|
||||
| E_matching (a , cs) -> union (self a) (matching_expression b cs)
|
||||
| E_failwith a -> self a
|
||||
| E_sequence (a , b) -> unions @@ List.map self [ a ; b ]
|
||||
| E_loop (expr , body) -> unions @@ List.map self [ expr ; body ]
|
||||
| E_assign (_ , _ , expr) -> self expr
|
||||
@ -476,7 +475,7 @@ let rec assert_value_eq (a, b: (value*value)) : unit result =
|
||||
| (E_literal _, _) | (E_variable _, _) | (E_application _, _)
|
||||
| (E_lambda _, _) | (E_let_in _, _) | (E_tuple_accessor _, _)
|
||||
| (E_record_accessor _, _)
|
||||
| (E_look_up _, _) | (E_matching _, _) | (E_failwith _, _)
|
||||
| (E_look_up _, _) | (E_matching _, _)
|
||||
| (E_assign _ , _)
|
||||
| (E_sequence _, _) | (E_loop _, _)-> fail @@ error_uncomparable_values "can't compare sequences nor loops" a b
|
||||
|
||||
|
@ -88,7 +88,6 @@ module Captured_variables = struct
|
||||
let%bind a' = self a in
|
||||
let%bind cs' = matching_expression b cs in
|
||||
ok @@ union a' cs'
|
||||
| E_failwith a -> self a
|
||||
| E_sequence (_ , b) -> self b
|
||||
| E_loop (expr , body) ->
|
||||
let%bind lst' = bind_map_list self [ expr ; body ] in
|
||||
|
@ -105,7 +105,6 @@ and expression =
|
||||
| E_look_up of (ae * ae)
|
||||
(* Advanced *)
|
||||
| E_matching of (ae * matching_expr)
|
||||
| E_failwith of ae
|
||||
(* Replace Statements *)
|
||||
| E_sequence of (ae * ae)
|
||||
| E_loop of (ae * ae)
|
||||
|
@ -22,8 +22,8 @@ let type_base ppf : type_base -> _ = function
|
||||
| Base_operation -> fprintf ppf "operation"
|
||||
|
||||
let rec type_ ppf : type_value -> _ = function
|
||||
| T_or(a, b) -> fprintf ppf "(%a) | (%a)" type_ a type_ b
|
||||
| T_pair(a, b) -> fprintf ppf "(%a) & (%a)" type_ a type_ b
|
||||
| T_or(a, b) -> fprintf ppf "(%a) | (%a)" annotated a annotated b
|
||||
| T_pair(a, b) -> fprintf ppf "(%a) & (%a)" annotated a annotated b
|
||||
| T_base b -> type_base ppf b
|
||||
| T_function(a, b) -> fprintf ppf "(%a) -> (%a)" type_ a type_ b
|
||||
| T_map(k, v) -> fprintf ppf "map(%a -> %a)" type_ k type_ v
|
||||
@ -37,6 +37,10 @@ let rec type_ ppf : type_value -> _ = function
|
||||
environment c
|
||||
type_ arg type_ ret
|
||||
|
||||
and annotated ppf : type_value annotated -> _ = function
|
||||
| (Some ann, a) -> fprintf ppf "(%a %%%s)" type_ a ann
|
||||
| (None, a) -> type_ ppf a
|
||||
|
||||
and environment_element ppf ((s, tv) : environment_element) =
|
||||
Format.fprintf ppf "%s : %a" s type_ tv
|
||||
|
||||
|
@ -102,11 +102,11 @@ let get_pair (v:value) = match v with
|
||||
| _ -> simple_fail "not a pair"
|
||||
|
||||
let get_t_pair (t:type_value) = match t with
|
||||
| T_pair (a, b) -> ok (a, b)
|
||||
| T_pair ((_, a), (_, b)) -> ok (a, b)
|
||||
| _ -> simple_fail "not a type pair"
|
||||
|
||||
let get_t_or (t:type_value) = match t with
|
||||
| T_or (a, b) -> ok (a, b)
|
||||
| T_or ((_, a), (_, b)) -> ok (a, b)
|
||||
| _ -> simple_fail "not a type or"
|
||||
|
||||
let get_t_map (t:type_value) = match t with
|
||||
@ -144,11 +144,11 @@ let wrong_type name t =
|
||||
error title content
|
||||
|
||||
let get_t_left t = match t with
|
||||
| T_or (a , _) -> ok a
|
||||
| T_or ((_, a) , _) -> ok a
|
||||
| _ -> fail @@ wrong_type "union" t
|
||||
|
||||
let get_t_right t = match t with
|
||||
| T_or (_ , b) -> ok b
|
||||
| T_or (_ , (_, b)) -> ok b
|
||||
| _ -> fail @@ wrong_type "union" t
|
||||
|
||||
let get_t_contract t = match t with
|
||||
|
@ -8,9 +8,11 @@ type type_base =
|
||||
| Base_string | Base_bytes | Base_address
|
||||
| Base_operation
|
||||
|
||||
type 'a annotated = string option * 'a
|
||||
|
||||
type type_value =
|
||||
| T_pair of (type_value * type_value)
|
||||
| T_or of type_value * type_value
|
||||
| T_pair of (type_value annotated * type_value annotated)
|
||||
| T_or of (type_value annotated * type_value annotated)
|
||||
| T_function of (type_value * type_value)
|
||||
| T_deep_closure of (environment * type_value * type_value)
|
||||
| T_base of type_base
|
||||
|
@ -41,7 +41,7 @@ function transfer_single(const action : action_transfer_single ; const s : stora
|
||||
begin
|
||||
const cards : cards = s.cards ;
|
||||
const card : card = get_force(action.card_to_transfer , cards) ;
|
||||
if (card.card_owner =/= source) then fail "This card doesn't belong to you" else skip ;
|
||||
if (card.card_owner =/= source) then failwith ("This card doesn't belong to you") else skip ;
|
||||
card.card_owner := action.destination ;
|
||||
cards[action.card_to_transfer] := card ;
|
||||
s.cards := cards ;
|
||||
@ -51,7 +51,7 @@ function transfer_single(const action : action_transfer_single ; const s : stora
|
||||
function sell_single(const action : action_sell_single ; const s : storage_type) : (list(operation) * storage_type) is
|
||||
begin
|
||||
const card : card = get_force(action.card_to_sell , s.cards) ;
|
||||
if (card.card_owner =/= source) then fail "This card doesn't belong to you" else skip ;
|
||||
if (card.card_owner =/= source) then failwith ("This card doesn't belong to you") else skip ;
|
||||
const card_pattern : card_pattern = get_force(card.card_pattern , s.card_patterns) ;
|
||||
card_pattern.quantity := abs(card_pattern.quantity - 1n);
|
||||
const card_patterns : card_patterns = s.card_patterns ;
|
||||
@ -71,7 +71,7 @@ function buy_single(const action : action_buy_single ; const s : storage_type) :
|
||||
// Check funds
|
||||
const card_pattern : card_pattern = get_force(action.card_to_buy , s.card_patterns) ;
|
||||
const price : tez = card_pattern.coefficient * (card_pattern.quantity + 1n) ;
|
||||
if (price > amount) then fail "Not enough money" else skip ;
|
||||
if (price > amount) then failwith ("Not enough money") else skip ;
|
||||
// Administrative procedure
|
||||
const operations : list(operation) = nil ;
|
||||
// Increase quantity
|
||||
|
@ -10,3 +10,24 @@ function main (const p : param; const s : unit) : list(operation) * unit is
|
||||
end
|
||||
}
|
||||
with ((nil : list(operation)), s)
|
||||
|
||||
function foobar (const i : int) : int is
|
||||
var p : param := Zero (42n) ;
|
||||
block {
|
||||
if i > 0 then block {
|
||||
i := i + 1 ;
|
||||
if i > 10 then block {
|
||||
i := 20 ;
|
||||
failwith ("who knows") ;
|
||||
i := 30 ;
|
||||
} else skip
|
||||
} else block {
|
||||
case p of
|
||||
| Zero (n) -> failwith ("wooo")
|
||||
| Pos (n) -> skip
|
||||
end
|
||||
}
|
||||
} with case p of
|
||||
| Zero (n) -> i
|
||||
| Pos (n) -> (failwith ("waaaa") : int)
|
||||
end
|
||||
|
4
src/test/contracts/tez.ligo
Normal file
@ -0,0 +1,4 @@
|
||||
const add_tez : tez = 21mtz + 21mtz;
|
||||
const sub_tez : tez = 21mtz - 20mtz;
|
||||
(* is this enough? *)
|
||||
const not_enough_tez : tez = 4611686018427387903mtz;
|
5
src/test/contracts/tez.mligo
Normal file
@ -0,0 +1,5 @@
|
||||
let add_tez : tez = 0.000021tz + 0.000021tz
|
||||
let sub_tez : tez = 0.000021tz - 0.000020tz
|
||||
let not_enough_tez : tez = 4611686018427.387903tz
|
||||
|
||||
let add_more_tez : tez = 100tz + 10tz + 1tz + 0.1tz + 0.01tz + 0.001tz
|
@ -670,6 +670,11 @@ let failwith_ligo () : unit result =
|
||||
let%bind _ = should_fail (e_pair (e_constructor "Zero" (e_nat 1)) (e_unit ())) in
|
||||
let%bind _ = should_work (e_pair (e_constructor "Pos" (e_nat 1)) (e_unit ())) in
|
||||
let%bind _ = should_fail (e_pair (e_constructor "Pos" (e_nat 0)) (e_unit ())) in
|
||||
let should_fail input = expect_fail program "foobar" (e_int input) in
|
||||
let should_work input n = expect_eq program "foobar" (e_int input) (e_int n) in
|
||||
let%bind () = should_fail 10 in
|
||||
let%bind () = should_fail @@ -10 in
|
||||
let%bind () = should_work 5 6 in
|
||||
ok ()
|
||||
|
||||
let failwith_mligo () : unit result =
|
||||
@ -698,7 +703,7 @@ let guess_string_mligo () : unit result =
|
||||
in expect_eq_n program "main" make_input make_expected
|
||||
|
||||
let basic_mligo () : unit result =
|
||||
let%bind typed = mtype_file ~debug_simplify:true "./contracts/basic.mligo" in
|
||||
let%bind typed = mtype_file "./contracts/basic.mligo" in
|
||||
let%bind result = Run.Of_typed.evaluate_entry typed "foo" in
|
||||
Ast_typed.assert_value_eq
|
||||
(Ast_typed.Combinators.e_a_empty_int (42 + 127), result)
|
||||
@ -787,6 +792,21 @@ let website2_ligo () : unit result =
|
||||
e_pair (e_typed_list [] t_operation) (e_int (op 42 n)) in
|
||||
expect_eq_n program "main" make_input make_expected
|
||||
|
||||
let tez_ligo () : unit result =
|
||||
let%bind program = type_file "./contracts/tez.ligo" in
|
||||
let%bind _ = expect_eq_evaluate program "add_tez" (e_mutez 42) in
|
||||
let%bind _ = expect_eq_evaluate program "sub_tez" (e_mutez 1) in
|
||||
let%bind _ = expect_eq_evaluate program "not_enough_tez" (e_mutez 4611686018427387903) in
|
||||
ok ()
|
||||
|
||||
let tez_mligo () : unit result =
|
||||
let%bind program = mtype_file "./contracts/tez.mligo" in
|
||||
let%bind _ = expect_eq_evaluate program "add_tez" (e_mutez 42) in
|
||||
let%bind _ = expect_eq_evaluate program "sub_tez" (e_mutez 1) in
|
||||
let%bind _ = expect_eq_evaluate program "not_enough_tez" (e_mutez 4611686018427387903) in
|
||||
let%bind _ = expect_eq_evaluate program "add_more_tez" (e_mutez 111111000) in
|
||||
ok ()
|
||||
|
||||
let main = test_suite "Integration (End to End)" [
|
||||
test "type alias" type_alias ;
|
||||
test "function" function_ ;
|
||||
@ -844,6 +864,8 @@ let main = test_suite "Integration (End to End)" [
|
||||
test "lambda mligo" lambda_mligo ;
|
||||
test "lambda ligo" lambda_ligo ;
|
||||
(* test "lambda2 mligo" lambda2_mligo ; *)
|
||||
test "tez (ligo)" tez_ligo ;
|
||||
test "tez (mligo)" tez_mligo ;
|
||||
test "website1 ligo" website1_ligo ;
|
||||
test "website2 ligo" website2_ligo ;
|
||||
]
|
||||
|
@ -953,8 +953,6 @@ let parse_michelson (type aft)
|
||||
?type_logger
|
||||
(bef:'a Script_typed_ir.stack_ty) (aft:aft Script_typed_ir.stack_ty)
|
||||
=
|
||||
let michelson = Michelson.strip_annots michelson in
|
||||
let michelson = Michelson.strip_nops michelson in
|
||||
parse_instr
|
||||
?type_logger
|
||||
top_level tezos_context
|
||||
@ -975,8 +973,6 @@ let parse_michelson_fail (type aft)
|
||||
?type_logger
|
||||
(bef:'a Script_typed_ir.stack_ty) (aft:aft Script_typed_ir.stack_ty)
|
||||
=
|
||||
let michelson = Michelson.strip_annots michelson in
|
||||
let michelson = Michelson.strip_nops michelson in
|
||||
parse_instr
|
||||
?type_logger
|
||||
top_level tezos_context
|
||||
@ -995,8 +991,6 @@ let parse_michelson_fail (type aft)
|
||||
let parse_michelson_data
|
||||
?(tezos_context = dummy_environment.tezos_context)
|
||||
michelson ty =
|
||||
let michelson = Michelson.strip_annots michelson in
|
||||
let michelson = Michelson.strip_nops michelson in
|
||||
parse_data tezos_context ty michelson >>=?? fun (data, _) ->
|
||||
return data
|
||||
|
||||
@ -1004,8 +998,6 @@ let parse_michelson_ty
|
||||
?(tezos_context = dummy_environment.tezos_context)
|
||||
?(allow_big_map = true) ?(allow_operation = true)
|
||||
michelson =
|
||||
let michelson = Michelson.strip_annots michelson in
|
||||
let michelson = Michelson.strip_nops michelson in
|
||||
Lwt.return @@ parse_ty tezos_context ~allow_big_map ~allow_operation michelson >>=?? fun (ty, _) ->
|
||||
return ty
|
||||
|
||||
|
18
vendors/ligo-utils/tezos-utils/x_michelson.ml
vendored
@ -75,12 +75,6 @@ let rec strip_annots : michelson -> michelson = function
|
||||
| Prim (l, p, lst, _) -> Prim (l, p, List.map strip_annots lst, [])
|
||||
| x -> x
|
||||
|
||||
let rec strip_nops : michelson -> michelson = function
|
||||
| Seq(l, [Prim (_, I_UNIT, _, _) ; Prim(_, I_DROP, _, _)]) -> Seq (l, [])
|
||||
| Seq(l, s) -> Seq(l, List.map strip_nops s)
|
||||
| Prim (l, p, lst, a) -> Prim (l, p, List.map strip_nops lst, a)
|
||||
| x -> x
|
||||
|
||||
let pp ppf (michelson:michelson) =
|
||||
let open Micheline_printer in
|
||||
let canonical = strip_locations michelson in
|
||||
@ -98,15 +92,3 @@ let pp_json ppf (michelson : michelson) =
|
||||
)
|
||||
in
|
||||
Format.fprintf ppf "%a" Tezos_data_encoding.Json.pp json
|
||||
|
||||
let pp_stripped ppf (michelson:michelson) =
|
||||
let open Micheline_printer in
|
||||
let michelson' = strip_nops @@ strip_annots michelson in
|
||||
let canonical = strip_locations michelson' in
|
||||
let node = printable string_of_prim canonical in
|
||||
print_expr ppf node
|
||||
|
||||
let pp_naked ppf m =
|
||||
let naked = strip_annots m in
|
||||
pp ppf naked
|
||||
|
||||
|