Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Create Smart Contract: Interstellar Currency Exchange #3

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
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
117 changes: 117 additions & 0 deletions Smart Contract: Interstellar Currency Exchange
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

interface IOracle {
function getExchangeRate(string memory fromCurrency, string memory toCurrency) external view returns (uint256);
}

contract InterstellarCurrencyExchange {
address public admin;
IOracle public oracle;

// Event untuk logging transaksi konversi
event CurrencyConverted(
address indexed user,
string fromCurrency,
string toCurrency,
uint256 inputAmount,
uint256 outputAmount,
uint256 rate
);

// Struktur data untuk menyimpan log konversi
struct ConversionLog {
address user;
string fromCurrency;
string toCurrency;
uint256 inputAmount;
uint256 outputAmount;
uint256 timestamp;
}

// Array log konversi
ConversionLog[] public conversionLogs;

modifier onlyAdmin() {
require(msg.sender == admin, "Only admin can execute this function");
_;
}

constructor(address _oracleAddress) {
admin = msg.sender;
oracle = IOracle(_oracleAddress);
}

/**
* @dev Fungsi untuk mengatur alamat oracle baru
*/
function setOracle(address _oracleAddress) external onlyAdmin {
oracle = IOracle(_oracleAddress);
}

/**
* @dev Fungsi untuk melakukan konversi mata uang
* @param fromCurrency Mata uang asal
* @param toCurrency Mata uang tujuan
* @param inputAmount Jumlah mata uang asal yang akan dikonversi
* @return outputAmount Jumlah mata uang tujuan yang dihasilkan
*/
function convertCurrency(
string memory fromCurrency,
string memory toCurrency,
uint256 inputAmount
) external returns (uint256 outputAmount) {
require(inputAmount > 0, "Input amount must be greater than 0");

// Ambil nilai tukar dari oracle
uint256 exchangeRate = oracle.getExchangeRate(fromCurrency, toCurrency);
require(exchangeRate > 0, "Exchange rate must be greater than 0");

// Hitung jumlah mata uang tujuan
outputAmount = (inputAmount * exchangeRate) / 1e18;

// Simpan log konversi
conversionLogs.push(
ConversionLog({
user: msg.sender,
fromCurrency: fromCurrency,
toCurrency: toCurrency,
inputAmount: inputAmount,
outputAmount: outputAmount,
timestamp: block.timestamp
})
);

// Emit event untuk logging
emit CurrencyConverted(msg.sender, fromCurrency, toCurrency, inputAmount, outputAmount, exchangeRate);

return outputAmount;
}

/**
* @dev Fungsi untuk mengambil log konversi terakhir
* @return logData Data log terakhir
*/
function getLastConversion() external view returns (ConversionLog memory logData) {
require(conversionLogs.length > 0, "No conversions found");
return conversionLogs[conversionLogs.length - 1];
}

/**
* @dev Fungsi untuk mendapatkan jumlah total log konversi
* @return count Jumlah log konversi
*/
function getConversionLogCount() external view returns (uint256 count) {
return conversionLogs.length;
}

/**
* @dev Fungsi untuk mengambil log konversi berdasarkan indeks
* @param index Indeks log yang ingin diambil
* @return logData Data log berdasarkan indeks
*/
function getConversionLogByIndex(uint256 index) external view returns (ConversionLog memory logData) {
require(index < conversionLogs.length, "Invalid index");
return conversionLogs[index];
}
}