├── .gitignore
├── ICO
├── Contracts
│ ├── AlephToken.sol
│ ├── Ico.sol
│ └── usdt.sol
└── FrontEnd
│ ├── Aleph.png
│ ├── USDT.png
│ ├── contracts.js
│ ├── index.html
│ ├── script.js
│ └── style.css
├── LICENSE
├── Presentacion.pdf
├── README.md
├── Token
└── Token.sol
├── helloWorld
└── HelloWorld.sol
└── soliditylang
└── solidity.sol
/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 | lerna-debug.log*
8 | .pnpm-debug.log*
9 |
10 | # Diagnostic reports (https://nodejs.org/api/report.html)
11 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
12 |
13 | # Runtime data
14 | pids
15 | *.pid
16 | *.seed
17 | *.pid.lock
18 |
19 | # Directory for instrumented libs generated by jscoverage/JSCover
20 | lib-cov
21 |
22 | # Coverage directory used by tools like istanbul
23 | coverage
24 | *.lcov
25 |
26 | # nyc test coverage
27 | .nyc_output
28 |
29 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
30 | .grunt
31 |
32 | # Bower dependency directory (https://bower.io/)
33 | bower_components
34 |
35 | # node-waf configuration
36 | .lock-wscript
37 |
38 | # Compiled binary addons (https://nodejs.org/api/addons.html)
39 | build/Release
40 |
41 | # Dependency directories
42 | node_modules/
43 | jspm_packages/
44 |
45 | # Snowpack dependency directory (https://snowpack.dev/)
46 | web_modules/
47 |
48 | # TypeScript cache
49 | *.tsbuildinfo
50 |
51 | # Optional npm cache directory
52 | .npm
53 |
54 | # Optional eslint cache
55 | .eslintcache
56 |
57 | # Optional stylelint cache
58 | .stylelintcache
59 |
60 | # Microbundle cache
61 | .rpt2_cache/
62 | .rts2_cache_cjs/
63 | .rts2_cache_es/
64 | .rts2_cache_umd/
65 |
66 | # Optional REPL history
67 | .node_repl_history
68 |
69 | # Output of 'npm pack'
70 | *.tgz
71 |
72 | # Yarn Integrity file
73 | .yarn-integrity
74 |
75 | # dotenv environment variable files
76 | .env
77 | .env.development.local
78 | .env.test.local
79 | .env.production.local
80 | .env.local
81 |
82 | # parcel-bundler cache (https://parceljs.org/)
83 | .cache
84 | .parcel-cache
85 |
86 | # Next.js build output
87 | .next
88 | out
89 |
90 | # Nuxt.js build / generate output
91 | .nuxt
92 | dist
93 |
94 | # Gatsby files
95 | .cache/
96 | # Comment in the public line in if your project uses Gatsby and not Next.js
97 | # https://nextjs.org/blog/next-9-1#public-directory-support
98 | # public
99 |
100 | # vuepress build output
101 | .vuepress/dist
102 |
103 | # vuepress v2.x temp and cache directory
104 | .temp
105 | .cache
106 |
107 | # Docusaurus cache and generated files
108 | .docusaurus
109 |
110 | # Serverless directories
111 | .serverless/
112 |
113 | # FuseBox cache
114 | .fusebox/
115 |
116 | # DynamoDB Local files
117 | .dynamodb/
118 |
119 | # TernJS port file
120 | .tern-port
121 |
122 | # Stores VSCode versions used for testing VSCode extensions
123 | .vscode-test
124 |
125 | # yarn v2
126 | .yarn/cache
127 | .yarn/unplugged
128 | .yarn/build-state.yml
129 | .yarn/install-state.gz
130 | .pnp.*
131 |
--------------------------------------------------------------------------------
/ICO/Contracts/AlephToken.sol:
--------------------------------------------------------------------------------
1 | // SPDX-License-Identifier: MIT
2 | pragma solidity ^0.8.20;
3 |
4 | import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
5 | import "@openzeppelin/contracts/access/Ownable.sol";
6 |
7 | // cambiar ownership a la ICO
8 | contract AlephToken is ERC20, Ownable {
9 | constructor() ERC20("AlephToken", "ATK") Ownable(msg.sender) {
10 | }
11 |
12 | function mint(address to, uint256 amount) public onlyOwner {
13 | _mint(to, amount);
14 | }
15 | }
--------------------------------------------------------------------------------
/ICO/Contracts/Ico.sol:
--------------------------------------------------------------------------------
1 | // SPDX-License-Identifier: MIT
2 | pragma solidity >0.7.0 <0.9.0;
3 |
4 | import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
5 | import "@openzeppelin/contracts/access/Ownable.sol";
6 |
7 | interface MintableERC20 is IERC20 {
8 | function mint(address to, uint256 amount) external;
9 | }
10 |
11 | contract ICO is Ownable {
12 |
13 | IERC20 public usdt;
14 | MintableERC20 public alephToken;
15 | uint256 public price;
16 |
17 | event BUY(address who, uint256 amount);
18 |
19 | constructor(address _usdt, address _alephToken, uint256 _price) Ownable(msg.sender) {
20 | usdt = IERC20(_usdt);
21 | alephToken = MintableERC20(_alephToken);
22 | price = _price;
23 | }
24 |
25 | function buy(uint256 _amountUSDT) external {
26 | // approve
27 | usdt.transferFrom(msg.sender, address(this) , _amountUSDT);
28 | uint256 _amount;
29 | _amount = _amountUSDT * price;
30 | alephToken.mint(msg.sender, _amount);
31 | emit BUY(msg.sender, _amount);
32 | }
33 |
34 | function extractUSDT() external onlyOwner {
35 | usdt.transfer(msg.sender,usdt.balanceOf(address(this)));
36 | }
37 |
38 | }
39 |
--------------------------------------------------------------------------------
/ICO/Contracts/usdt.sol:
--------------------------------------------------------------------------------
1 | // SPDX-License-Identifier: MIT
2 | pragma solidity ^0.8.20;
3 |
4 | import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
5 |
6 | contract Thether is ERC20 {
7 | constructor() ERC20("Thether", "USDT") {
8 | }
9 |
10 | function mint(address to, uint256 amount) public {
11 | _mint(to, amount);
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/ICO/FrontEnd/Aleph.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DigiCris/alephSolidity/bfcfadca669e244b2f1383b11c04805f399eea74/ICO/FrontEnd/Aleph.png
--------------------------------------------------------------------------------
/ICO/FrontEnd/USDT.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DigiCris/alephSolidity/bfcfadca669e244b2f1383b11c04805f399eea74/ICO/FrontEnd/USDT.png
--------------------------------------------------------------------------------
/ICO/FrontEnd/contracts.js:
--------------------------------------------------------------------------------
1 | var exchange_address = "0xD941204eE96ff96605050b9D42f620Ccd7feC6fC";
2 | var exchange_abi = [{"inputs":[{"internalType":"uint256","name":"_amountUSDT","type":"uint256"}],"name":"buy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"extractUSDT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_usdt","type":"address"},{"internalType":"address","name":"_alephToken","type":"address"},{"internalType":"uint256","name":"_price","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"who","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BUY","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"alephToken","outputs":[{"internalType":"contract MintableERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"usdt","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"}];
3 |
4 | var usdt_abi = [{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}];
5 | var usdt_address = "0x365305FaDDdd0E2EacdCB73473193fc4c7493459";
6 |
7 | var aleph_abi = [{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}];
8 | var aleph_address = "0xD08188fe25f90E2DAFA8a9Fb37C82510b96CA00A";
--------------------------------------------------------------------------------
/ICO/FrontEnd/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
18 |
19 |
20 |
Swap
21 |
Trade tokens in an instant
22 |
23 |
24 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
65 |
66 |
67 |
68 |
69 |
--------------------------------------------------------------------------------
/ICO/FrontEnd/script.js:
--------------------------------------------------------------------------------
1 | var amount0=0;
2 | var amount1=1;
3 | var P0=0.1;// precio
4 | var P1=10;// Precio de BNB
5 |
6 | var buyOrApprove = 0;
7 |
8 | var web3;
9 |
10 | var address="Conectar";
11 | var swapInstance;
12 |
13 |
14 | init();
15 | var isConnected = obtenerValorDeLocalStorage("SwapConected");
16 | if(isConnected=="true"){
17 | connect();
18 | }
19 |
20 | async function init() {
21 | // inyectar proveedor a web3
22 | // instanciar contratos
23 | // leer precio P1
24 | web3 = new Web3(window.ethereum);
25 | swapInstance = new web3.eth.Contract(exchange_abi, exchange_address);
26 | P0 = await swapInstance.methods.price().call();
27 | P1 = Number(P0);
28 | P0 = P1;
29 | //alert(P0)
30 | }
31 |
32 |
33 | async function connect()
34 | {
35 | //alert("conectar. Obtener address metamask");
36 | //address = "0x98402384209348209348230948230942";
37 | await window.ethereum.request({"method": "eth_requestAccounts", "params": []});
38 | const account = await web3.eth.getAccounts();
39 |
40 | address = account[0];
41 |
42 |
43 | document.getElementById('account').innerHTML=address.toString().slice(0,6)+"...";
44 |
45 | await setBalanceUSDT();
46 | await setBalanceAleph();
47 | await allowance();
48 |
49 | if(buyOrApprove==0) {
50 | document.getElementById('swap-submit').innerHTML = "approve";
51 | }
52 | }
53 |
54 |
55 | async function handleSubmit() {
56 | // acá la aprobacion y compra.
57 | const AmountToBuy = document.querySelector("#form > input.IHAVE").value;
58 |
59 | if(buyOrApprove!=0) {
60 | swapInstance.methods.buy(AmountToBuy).send({from: address})
61 | .on('transactionHash', function(hash){
62 | showToast("transactionHash: "+hash, "orange");
63 | })
64 | .on('confirmation', function(confirmationNumber, receipt){
65 | console.log(confirmationNumber);
66 | })
67 | .on('receipt', async function(receipt){
68 | console.log(receipt);
69 | showToast("transaccion correcta", "green");
70 | await setBalanceUSDT();
71 | await setBalanceAleph();
72 | })
73 | } else {
74 | usdtInstance = new web3.eth.Contract(usdt_abi, usdt_address);
75 | usdtInstance.methods.approve(exchange_address,AmountToBuy).send({from: address})
76 | .on('transactionHash', function(hash){
77 | showToast("transactionHash: "+hash, "orange");
78 | })
79 | .on('confirmation', function(confirmationNumber, receipt){
80 | console.log(confirmationNumber);
81 | })
82 | .on('receipt', async function(receipt){
83 | console.log(receipt);
84 | showToast("transaccion correcta", "green");
85 | await allowance();
86 | if(buyOrApprove==0) {
87 | document.getElementById('swap-submit').innerHTML = "Approve";
88 | } else {
89 | document.getElementById('swap-submit').innerHTML = "Swapp";
90 | }
91 | })
92 | }
93 |
94 | }
95 |
96 |
97 | async function setBalanceUSDT() {
98 | usdtInstance = new web3.eth.Contract(usdt_abi, usdt_address);
99 | const balanceUSDT = await usdtInstance.methods.balanceOf(address).call();
100 | document.getElementById("balanceUSDT").innerHTML = balanceUSDT;
101 | }
102 |
103 | async function setBalanceAleph() {
104 | alephInstance = new web3.eth.Contract(aleph_abi, aleph_address);
105 | const balanceAleph = await alephInstance.methods.balanceOf(address).call();
106 | document.getElementById("balanceAleph").innerHTML = balanceAleph;
107 | }
108 |
109 | async function allowance() {
110 | usdtInstance = new web3.eth.Contract(usdt_abi, usdt_address);
111 | const allowed = await usdtInstance.methods.allowance(address,exchange_address).call();
112 | buyOrApprove = allowed;
113 | }
114 |
115 |
116 |
117 |
118 | /////////////////////////// Funciones comunes
119 |
120 | function setValueTokenToSpend() {
121 | amount0 = document.getElementsByClassName("IHAVE")[0].value;
122 | amount0 = amount0 / 1;
123 | amount1 = amount0/P1 ;
124 | document.getElementsByClassName("IWANT")[0].value=amount1;
125 | }
126 |
127 | function showToast(address, color) {
128 | var toast = document.getElementById("toast");
129 | var addressLines = address.match(/.{1,20}/g); // Dividir la dirección en grupos de 6 caracteres
130 |
131 | toast.innerHTML = ""; // Limpiar el contenido del toast
132 |
133 | addressLines.forEach(function(line) {
134 | var lineElement = document.createElement("div");
135 | lineElement.textContent = line;
136 | toast.appendChild(lineElement);
137 | });
138 |
139 | toast.style.backgroundColor = color;
140 | toast.classList.add("show");
141 | setTimeout(function(){
142 | toast.classList.remove("show");
143 | }, 3000);
144 | }
145 |
146 | // Función para guardar un valor en localStorage
147 | function guardarValorEnLocalStorage(key, valor) {
148 | localStorage.setItem(key, valor);
149 | }
150 |
151 | // Función para obtener un valor de localStorage
152 | function obtenerValorDeLocalStorage(key) {
153 | const valor = localStorage.getItem(key);
154 | return valor !== null ? valor : "DE";
155 | }
--------------------------------------------------------------------------------
/ICO/FrontEnd/style.css:
--------------------------------------------------------------------------------
1 | body
2 | {
3 | /*background-color: #e7fbff;*/
4 | background-color: #171717;
5 | background-size: cover; /* Ajusta la imagen al tamaño del contenedor */
6 | background-position: center; /* Centra la imagen en el contenedor */
7 | background-repeat: no-repeat; /* Evita que la imagen se repita */
8 | }
9 |
10 | #swap-box
11 | {
12 | width: 340px;
13 | height: 500px;
14 | background-color: white;
15 | margin: auto;
16 | border-radius: 24px;
17 | border: 1px solid #e7e3eb;
18 | box-shadow: 4px 2px 2px grey;
19 |
20 | font-weight: bolder;
21 | font-size: 20px;
22 | color: #280d5f;
23 |
24 | margin-top: 60px;
25 | clear: both;
26 | }
27 |
28 | #swap-menu
29 | {
30 | width: 100%;
31 | height: 52px;
32 | border-top-right-radius:24px;
33 | border-top-left-radius:24px;
34 | background-color: #eeeaf4;
35 | padding-top: 16px;
36 | text-align: center;
37 | }
38 |
39 | .swap-button
40 | {
41 | width: 168px;
42 | height: 52px;
43 | border-top-right-radius:24px;
44 | border-top-left-radius:24px;
45 | background-color: #eeeaf4;
46 | display: flex;
47 | align-items: center;
48 | justify-content: center;
49 | float: left;
50 | text-align: center;
51 | cursor: pointer;
52 | color: #7a6eaa;
53 | }
54 |
55 | .swap-button-active
56 | {
57 | background-color: white;
58 | color: #280d5f;
59 | }
60 |
61 | #swap-title-box
62 | {
63 | height: 60px;
64 | border-bottom: solid 1px #eeeaf4;
65 | }
66 |
67 | #swap-title
68 | {
69 | text-align: center;
70 | margin-bottom: -5px;
71 | margin-top: 20px;
72 | font-weight: bolder;
73 | }
74 |
75 | #swap-subtitle
76 | {
77 | font-size: 12px;
78 | text-align: center;
79 | color: #7a6eb2;
80 | font-weight: bold;
81 | }
82 |
83 | #swap-form-box
84 | {
85 | width: calc(100% - 1px);
86 | height: 288px;
87 | border: 1px solid #eeeaf4;
88 | }
89 |
90 | #form
91 | {
92 | display: flex;
93 | flex-direction: column;
94 | padding: 20px;
95 | }
96 | form
97 | {
98 | display: flex;
99 | flex-direction: column;
100 | padding: 20px;
101 | }
102 | #alineadoTextoImagenCentro
103 | {
104 | vertical-align: middle;
105 | height:28px;
106 | width:28px;
107 | float: left;
108 | }
109 | .swap-balance
110 | {
111 | float: right;
112 | color: #877cad;
113 | font-size: 12px;
114 | padding-top: 4px;
115 | }
116 | input, #swap-submit
117 | {
118 | width: 288px;
119 | height: 60px;
120 | border-radius: 24px;
121 | background-color: #eeeaf4;
122 | border-color: transparent;
123 | box-shadow: 1px 2px 2px grey;
124 | text-align: right;
125 | font-size: 20px;
126 | padding-right: 12px;
127 | }
128 |
129 | #swap-arrow
130 | {
131 | padding-top: 16px;
132 | padding-bottom: 16px;
133 | padding-left: 132px;
134 | padding-right: 132px;
135 | text-align: center;
136 | }
137 | #swap-up-down:before
138 | {
139 | background-color: #eeeaf4;
140 | display: inline;
141 | padding: 4px;
142 | border-radius: 50%;
143 | color:#1fc7d4;
144 | content:"🡣";
145 | cursor: pointer;
146 | }
147 | #swap-up-down:hover:before
148 | {
149 | background-color: #1fc7d4;
150 | color:white;
151 | content:"⮁";
152 | }
153 | .hidden
154 | {
155 | display: none;
156 | }
157 |
158 | .separador-vertical
159 | {
160 | width: 100%;
161 | height: 28px;
162 | }
163 | #swap-price-word
164 | {
165 | color: #9a41ce;
166 | font-size: 12px;
167 | font-weight: bolder;
168 | padding-top: 8px;
169 | }
170 | #swap-price
171 | {
172 | float: right;
173 | color: #282464;
174 | font-size: 12px;
175 | }
176 |
177 | #swap-submit
178 | {
179 | height: 52px;
180 | text-align: center;
181 | font-weight: bold;
182 | margin-top: 28px;
183 | background-color: #1fc7d4;
184 | color: white;
185 | cursor: pointer;
186 | }
187 |
188 | #swap-submit:hover
189 | {
190 | background-color: #2fecfb;
191 | }
192 |
193 | button {
194 | height: 40px;
195 | width: 104px;
196 | text-align: center;
197 | font-weight: bold;
198 | margin-top: 28px;
199 | background-color: #1fc7d4;
200 | color: white;
201 | cursor: pointer;
202 | border-radius: 24px;
203 | float: right;
204 | clear: both;
205 | }
206 |
207 | .token {
208 | padding-left: 8px;
209 | }
210 |
211 |
212 |
213 | /*Agregado para el toast*/
214 | #toast {
215 | visibility: hidden;
216 | max-width: 200px;
217 | background-color: #333;
218 | color: #fff;
219 | text-align: center;
220 | border-radius: 4px;
221 | padding: 16px;
222 | position: fixed;
223 | z-index: 10000;
224 | left: 50%;
225 | bottom: 30px;
226 | transform: translateX(-50%);
227 | }
228 |
229 | #toast.show {
230 | visibility: visible;
231 | -webkit-animation: fadein 0.5s, fadeout 0.5s 2.5s;
232 | animation: fadein 0.5s, fadeout 0.5s 2.5s;
233 | }
234 |
235 | @-webkit-keyframes fadein {
236 | from {bottom: 0; opacity: 0;}
237 | to {bottom: 30px; opacity: 1;}
238 | }
239 |
240 | @keyframes fadein {
241 | from {bottom: 0; opacity: 0;}
242 | to {bottom: 30px; opacity: 1;}
243 | }
244 |
245 | @-webkit-keyframes fadeout {
246 | from {bottom: 30px; opacity: 1;}
247 | to {bottom: 0; opacity: 0;}
248 | }
249 |
250 | @keyframes fadeout {
251 | from {bottom: 30px; opacity: 1;}
252 | to {bottom: 0; opacity: 0;}
253 | }
254 |
255 |
256 |
257 |
258 | /*Esto para el spinner*/
259 | .spinner-container {
260 | display: none;
261 | position: absolute;
262 | top: 0;
263 | left: 0;
264 | width: 100%;
265 | height: 100%;
266 | background-color: rgba(255, 255, 255, 0.5);
267 | z-index: 9999;
268 | }
269 |
270 | .spinner {
271 | position: absolute;
272 | top: 50%;
273 | left: 50%;
274 | transform: translate(-50%, -50%);
275 | width: 40px;
276 | height: 40px;
277 | border: 4px solid #ccc;
278 | border-top-color: #333;
279 | border-radius: 50%;
280 | animation: spin 1s ease-in-out infinite;
281 | }
282 |
283 | @keyframes spin {
284 | 0% {
285 | transform: translate(-50%, -50%) rotate(0deg);
286 | }
287 | 100% {
288 | transform: translate(-50%, -50%) rotate(360deg);
289 | }
290 | }
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2024 DigiCris
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/Presentacion.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DigiCris/alephSolidity/bfcfadca669e244b2f1383b11c04805f399eea74/Presentacion.pdf
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # alephSolidity
2 | Here you can find the material of "Intro to smart contract and solidity". First class of the bootcamp during Aleph 2024
3 |
--------------------------------------------------------------------------------
/Token/Token.sol:
--------------------------------------------------------------------------------
1 | // SPDX-License-Identifier: MIT
2 | pragma solidity ^0.8.20;
3 |
4 | import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
5 | import "@openzeppelin/contracts/access/Ownable.sol";
6 |
7 | contract AlephToken is ERC20, Ownable {
8 |
9 | constructor(address initialOwner) ERC20("AlephToken", "ATK") Ownable(initialOwner) {
10 | _mint(msg.sender, 1000000 * 10 ** decimals());
11 | }
12 |
13 | function mint(address to, uint256 amount) public onlyOwner {
14 | _mint(to, amount);
15 | }
16 | }
--------------------------------------------------------------------------------
/helloWorld/HelloWorld.sol:
--------------------------------------------------------------------------------
1 | // SPDX-License-Identifier: MIT
2 | pragma solidity >0.7.0 <0.9.0;
3 |
4 | contract Faucet {
5 | string mensaje;
6 |
7 | function setMensaje(string calldata _mensaje) public {
8 | mensaje = _mensaje;
9 | }
10 |
11 | function getMensaje() public view returns(string memory) {
12 | return(mensaje);
13 | }
14 | }
--------------------------------------------------------------------------------
/soliditylang/solidity.sol:
--------------------------------------------------------------------------------
1 | // SPDX-License-Identifier: MIT
2 | pragma solidity >=0.7.0 <0.9.0;
3 |
4 | contract test{
5 | uint256 public counter;
6 | address private owner;
7 |
8 | // constructor que me permite mandarle ethers y establece como owner del contrato a quien lo crea
9 | constructor() payable {
10 | owner=msg.sender;
11 | }
12 |
13 | // Funcion para ver los limites de un tipo
14 | function intLimits() external pure returns (int8,int8) {
15 | return ( (type(int8).min),(type(int8).max) );
16 | }
17 |
18 | // generacion de un underflow
19 | function underflow() external pure returns (int8) {
20 | return ( type(int8).min / (-1) );
21 | }
22 |
23 | // estudio de side effects
24 | function Counter() external {
25 | if (1 == 0 && count()){} // Que pasa con counter? se incrementa o no?
26 | }
27 | function count() internal returns(bool) {
28 | counter++;
29 | return(true);
30 | }
31 |
32 | // Alguien sabría decir por que falla?
33 | function underflow2() external pure returns (uint16) {
34 | uint16 a= 255 + (true ? 1 : 0) ;
35 | return a;
36 | }
37 |
38 | // cualquiera saca los ethers
39 | function transferEtherAny() external {
40 | address payable _to;
41 | _to = payable (msg.sender); // por que debo hacer este casteo?
42 | _to.transfer(address(this).balance);
43 | }
44 |
45 | // solo el owner saca los ethers. Utilizo send para ver la diferencia con transfer. Call y delegateCall los veremos luego
46 | modifier onlyOwner(){
47 | require(owner==msg.sender,"no eres el owner");
48 | _;
49 | }
50 | function transferEtherOwner() external onlyOwner {
51 | address payable _to;
52 | _to = payable (msg.sender);
53 | if( _to.send(address(this).balance) == false ){
54 | revert("fallo el envio");
55 | }
56 | }
57 |
58 | // structs + mapping + variables publicas
59 | struct Person{
60 | string name;
61 | uint256 id;
62 | }
63 | mapping (address => Person) public myInfo;
64 |
65 | function cargarDatos(string calldata _name, uint256 _id) external {
66 | myInfo[msg.sender].name = _name;
67 | myInfo[msg.sender].id = _id;
68 | }
69 |
70 | // struct + array + variables publicas (Ver diferencia de gas con la anterior)
71 | Person[] public myInfoArray;
72 |
73 | function cargarDatosArray(string calldata _name, uint256 _id) external {
74 | Person memory aux;
75 | aux.name = _name;
76 | aux.id = _id;
77 | myInfoArray.push(aux);
78 | }
79 |
80 | // Devolver todo el aray myInfoArray (el default getter no me devuelve todo el array, esto si)
81 |
82 | function getMyInfoArray() external view returns (Person[] memory) {
83 | return myInfoArray;
84 | }
85 |
86 |
87 | //bytes
88 | bytes1 public _bytes1="a";
89 | bytes2 public _bytes2="ab";
90 | bytes public _bytesArray;//0x606162 => igual a string no alineado a 256
91 | function _bytes3Setter(bytes calldata _byteArray) external { // ver memory vs calldata
92 | _bytesArray = _byteArray;
93 | }
94 |
95 | //operaciones sobre literales
96 | function sumaConstante() external pure returns(uint256){
97 | uint256 a=1;
98 | return ( 2.5 + 2.5 + a );
99 | // return ( 2.5 + a + 2.5 ); // Por que esta mal?
100 | }
101 |
102 | function compararTiempo(bool _choice) external pure returns(bool)
103 | {
104 | if(_choice){
105 | return(60 minutes == 1 hours);
106 | }
107 | else{
108 | return(61 minutes == 1 hours);
109 | }
110 | }
111 |
112 | function compararMoneda(bool _choice) external pure returns(bool)
113 | {
114 | if(_choice){
115 | return(1000000000000000000 wei == 1 ether);
116 | }
117 | else{
118 | return(1400000000000000000 wei == 1 ether);
119 | }
120 | }
121 |
122 | //Enumeraciones y manejo de estados
123 | enum Estado{ // Maxio puede tener 256 miembros y eso es porque está contenido en un unit8
124 | prendido,
125 | apagado
126 | }
127 | Estado public state;
128 | function toggleState() external {
129 | if(state==Estado.prendido) {
130 | state=Estado.apagado;
131 | }
132 | else {
133 | state=Estado.prendido;
134 | }
135 | }
136 |
137 | // push para arrays del tipo storage
138 | uint16[] public valuePushed;
139 | function agregarValor(uint16 _agregar) public {
140 | valuePushed.push(_agregar); // push() es de costo fijo != push(algo)... Pop es variable en funcion de lo que le pasemos como push(algo)
141 | }
142 |
143 |
144 | // Copia por referencia (memoria a memoria o storage a storage)
145 | // Ojo con esto y evitar dangling references porque no se sabe como se comportara
146 | uint32[] public referencia;
147 |
148 | function modificarReferencia(uint32 _number) external {
149 | uint32[] storage _referencia = referencia;
150 | _referencia.push(_number);
151 | }
152 |
153 |
154 | // string por bytes
155 | string public curso="Blockchain";
156 |
157 | function modificarCurso(bytes1 _letra) external {
158 | //curso[0]=_letra; // no se puede
159 | bytes(curso)[0]=_letra; // 0x63
160 | // bytes es cmo si fuera un bytes1[] pero optimiza memoria no alineandola a 256bits
161 | }
162 |
163 | //comparacion de strings (La comparacion no puede ser en strings y por eso se hashea)
164 | function comparar(string calldata a, string calldata b) pure external returns (string memory) {
165 | if( keccak256(bytes(a)) == keccak256(bytes(b)) ) {
166 | return ("iguales");
167 | }
168 | else {
169 | return ("distintos");
170 | }
171 | }
172 |
173 | // Propiedades de bloques
174 | function bloque() view external returns(uint256,uint256,uint256,address){
175 | return (block.difficulty, block.gaslimit, block.number, block.coinbase);
176 | }
177 |
178 | //Valor pseudo Aleatorio (Por que no usarlo como aleatorio?)
179 | function random() view external returns(uint256){
180 | uint256 _aleatorio = uint256(keccak256(abi.encodePacked(block.timestamp, block.difficulty))) % 100;
181 | return (_aleatorio);
182 | }
183 |
184 | // Propiedades de transaccion
185 | function transaccion() external view returns (uint256, address) {
186 | return(tx.gasprice, tx.origin); // ver pagina 17 del modulo 2
187 | }
188 |
189 | //propiedades de mensajes
190 | function mensaje() external view returns(bytes memory,uint256,bytes4){
191 | uint256 a = gasleft(); // msg.gas fue deprecada
192 | return (msg.data, a, msg.sig);
193 | }
194 | function valueSent() external payable returns(uint256){
195 | return (msg.value);
196 | }
197 |
198 | //revert vs require:probar con 7.1
199 | function revertir(bool _choice) external {
200 | if(_choice) {
201 | assert(1==0);
202 | }
203 | else {
204 | require(1==0, "1 no es igual a 0");
205 | }
206 | counter++; // Lo puse solo para que me cobre el gas
207 | // revert lo vimos con el .send
208 | // throw() esta deprecado hace tiempo
209 | }
210 |
211 | //arrays variables en memoria. Siempre deben ser fijos, aunque pueda hacerse en tiempo de ejcucion.
212 | function varArrMem(uint256 _i) external pure returns(uint256[] memory,uint256) {
213 | uint256[] memory hola = new uint256[](_i);
214 | hola[0]=1;
215 | hola[1]=2;
216 | return (hola,hola.length); // probar que pasa al mandarle a _i= (1;2;10)
217 | }
218 |
219 | }
220 |
221 |
222 | // trabajando al contrato como si fuera su propio tipo
223 | contract testSup{
224 | test contrato;
225 |
226 | constructor(address _addr){
227 | contrato=test(_addr);
228 | }
229 |
230 | function callContrato() external view returns(int8, int8){
231 | return contrato.intLimits();
232 | }
233 | }
--------------------------------------------------------------------------------