Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
80 changes: 80 additions & 0 deletions Contrak pintar orakel chainlink
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol";

contract IntergalacticCurrencyExchangeWithOracle {

struct Currency {
string symbol;
address priceFeed; // Address dari orakel Chainlink
}

mapping(string => Currency) public currencies;
mapping(address => mapping(string => uint256)) public balances;

event Deposit(address indexed user, uint256 amount, string currency);
event Withdraw(address indexed user, uint256 amount, string currency);
event Exchange(
address indexed user,
uint256 amount,
string fromCurrency,
string toCurrency,
uint256 resultAmount
);

// Fungsi untuk menambahkan atau memperbarui mata uang dan alamat orakel Chainlink
function addOrUpdateCurrency(string memory symbol, address priceFeed) public {
currencies[symbol] = Currency(symbol, priceFeed);
}

// Fungsi untuk deposit mata uang
function deposit(uint256 amount, string memory symbol) public {
require(currencies[symbol].priceFeed != address(0), "Mata uang tidak valid");
balances[msg.sender][symbol] += amount;
emit Deposit(msg.sender, amount, symbol);
}

// Fungsi untuk menarik dana
function withdraw(uint256 amount, string memory symbol) public {
require(balances[msg.sender][symbol] >= amount, "Saldo tidak cukup");
balances[msg.sender][symbol] -= amount;
emit Withdraw(msg.sender, amount, symbol);
}

// Fungsi untuk menukar antar mata uang menggunakan orakel Chainlink
function exchange(
uint256 amount,
string memory fromCurrency,
string memory toCurrency
) public {
require(balances[msg.sender][fromCurrency] >= amount, "Saldo tidak cukup");
require(currencies[fromCurrency].priceFeed != address(0), "Mata uang asal tidak valid");
require(currencies[toCurrency].priceFeed != address(0), "Mata uang tujuan tidak valid");

// Mendapatkan nilai tukar dari orakel
uint256 fromRate = getLatestPrice(currencies[fromCurrency].priceFeed);
uint256 toRate = getLatestPrice(currencies[toCurrency].priceFeed);

// Menghitung jumlah yang akan diterima dalam mata uang tujuan
uint256 resultAmount = (amount * fromRate) / toRate;

balances[msg.sender][fromCurrency] -= amount;
balances[msg.sender][toCurrency] += resultAmount;

emit Exchange(msg.sender, amount, fromCurrency, toCurrency, resultAmount);
}

// Fungsi untuk mendapatkan harga terbaru dari orakel Chainlink
function getLatestPrice(address priceFeed) internal view returns (uint256) {
AggregatorV3Interface aggregator = AggregatorV3Interface(priceFeed);
(, int256 price,,,) = aggregator.latestRoundData();
require(price > 0, "Harga tidak valid dari orakel");
return uint256(price);
}

// Fungsi untuk mendapatkan saldo pengguna
function getBalance(address user, string memory symbol) public view returns (uint256) {
return balances[user][symbol];
}
}
10 changes: 10 additions & 0 deletions Integrasi dengan Orakel
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
Agar nilai tukar tetap akurat, modul ini bisa dikembangkan dengan integrasi orakel blockchain seperti Chainlink, yang akan memperbarui nilai tukar sesuai dengan data real-time dari pasar intergalaksi atau galaksi lain.

Untuk mengintegrasikan modul ini dengan orakel, kita dapat menggunakan layanan seperti Chainlink. Orakel memungkinkan kontrak pintar untuk mendapatkan data eksternal, termasuk nilai tukar intergalaksi yang bisa berubah-ubah secara real-time. Berikut adalah langkah-langkah untuk mengintegrasikan orakel ke dalam kontrak pintar yang sudah ada.

Prasyarat Integrasi

1. Chainlink Oracle: Chainlink menyediakan layanan orakel yang dapat mengirim data ke kontrak pintar di blockchain.


2. Kontrak Pintar dengan Chainlink: Kita perlu menambahkan Chainlink dalam kontrak pintar dan meminta data harga saat pertukaran dilakukan.
66 changes: 66 additions & 0 deletions Solidity
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract IntergalacticCurrencyExchange {

struct Currency {
string symbol;
uint256 rate; // nilai tukar relatif terhadap unit dasar (misalnya USD)
}

mapping(string => Currency) public currencies;
mapping(address => mapping(string => uint256)) public balances;

event Deposit(address indexed user, uint256 amount, string currency);
event Withdraw(address indexed user, uint256 amount, string currency);
event Exchange(
address indexed user,
uint256 amount,
string fromCurrency,
string toCurrency,
uint256 resultAmount
);

// Fungsi untuk menambahkan atau memperbarui mata uang dan nilai tukar
function addOrUpdateCurrency(string memory symbol, uint256 rate) public {
currencies[symbol] = Currency(symbol, rate);
}

// Fungsi untuk deposit mata uang
function deposit(uint256 amount, string memory symbol) public {
require(currencies[symbol].rate > 0, "Mata uang tidak valid");
balances[msg.sender][symbol] += amount;
emit Deposit(msg.sender, amount, symbol);
}

// Fungsi untuk menarik dana
function withdraw(uint256 amount, string memory symbol) public {
require(balances[msg.sender][symbol] >= amount, "Saldo tidak cukup");
balances[msg.sender][symbol] -= amount;
emit Withdraw(msg.sender, amount, symbol);
}

// Fungsi untuk menukar antar mata uang
function exchange(
uint256 amount,
string memory fromCurrency,
string memory toCurrency
) public {
require(balances[msg.sender][fromCurrency] >= amount, "Saldo tidak cukup");
require(currencies[fromCurrency].rate > 0, "Mata uang asal tidak valid");
require(currencies[toCurrency].rate > 0, "Mata uang tujuan tidak valid");

// Menghitung jumlah yang akan diterima dalam mata uang tujuan
uint256 resultAmount = (amount * currencies[fromCurrency].rate) / currencies[toCurrency].rate;

balances[msg.sender][fromCurrency] -= amount;
balances[msg.sender][toCurrency] += resultAmount;

emit Exchange(msg.sender, amount, fromCurrency, toCurrency, resultAmount);
}

// Fungsi untuk mendapatkan saldo pengguna
function getBalance(address user, string memory symbol) public view returns (uint256) {
return balances[user][symbol];
}
}