// contracts/KeepPromise.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "./ERC721.sol";
import "./../../utils/Counters.sol";
struct Promise {
uint256 _id;
string _promise;
string _deadline;
string _punishment;
address _punisher;
}
contract KeepPromise is ERC721 {
using Counters for Counters.Counter;
Counters.Counter private _promiseIds;
mapping(uint256 => Promise) private _promises;
mapping(address => string) private _playerNickNames;
constructor() public ERC721("Promise", "PRM") {}
function join(string memory pNickName) public returns(string memory) {
address player = msg.sender;
require(_notJoined(player), "KeepPromise: you've already joined game");
_playerNickNames[player] = pNickName;
return string(abi.encodePacked("SUCCESS: ", pNickName));
}
function submitPromise(
string memory pPromise,
string memory pDeadline,
string memory pPunishment,
address pPunisher
) public returns (uint256)
{
address player = msg.sender;
require(_joined(player), "KeepPromise: you've not joined game yet");
require(_joined(pPunisher), "KeepPromise: the Punisher's not joined game yet");
_promiseIds.increment();
uint256 newPromiseId = _promiseIds.current();
_mint(player, newPromiseId);
Promise memory prom = Promise(newPromiseId, pPromise, pDeadline, pPunishment, pPunisher);
_addPromise(newPromiseId, prom);
return newPromiseId;
}
function getPromise(uint256 pPromiseId) public view returns(Promise memory) {
address player = msg.sender;
require(_joined(player), "KeepPromise: you've not joined game yet");
return _promises[pPromiseId];
}
function getNickName() public view returns(string memory) {
address player = msg.sender;
return _playerNickNames[player];
}
function getPlayerNickName(address pPlayer) public view returns(string memory) {
return _playerNickNames[pPlayer];
}
function _addPromise(uint256 pPromiseId, Promise memory pPromise) internal virtual {
_promises[pPromiseId] = pPromise;
}
function _joined(address pPlayer) internal view virtual returns (bool) {
return bytes(_playerNickNames[pPlayer]).length != 0;
}
function _notJoined(address pPlayer) internal view virtual returns (bool) {
return bytes(_playerNickNames[pPlayer]).length == 0;
}
}
Chạy lệnh sẽ thế này:
let contract = await KeepPromise.deployed()
contract.join("Dzung")
contract.getNickName();
contract.submitPromise("Love myself", "2021-12-12", "Love Her", "0x3c31b4b9d6c24bad29498f99aaa6914231362c7f")
contract.getPromise(1);