diff --git a/packages/hardhat/contracts/MiniRaffleV3.sol b/packages/hardhat/contracts/MiniRaffleV3.sol new file mode 100644 index 0000000..adccc3a --- /dev/null +++ b/packages/hardhat/contracts/MiniRaffleV3.sol @@ -0,0 +1,509 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "./MiniPoints.sol"; +import './physicalNFT.sol'; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "witnet-solidity-bridge/contracts/interfaces/IWitnetRandomness.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol"; +import "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; + +contract AkibaRaffleV3 is UUPSUpgradeable, ReentrancyGuardUpgradeable { + using SafeERC20 for IERC20; + + + address public owner; + address public prizeNFT; + IMiniPoints public miniPoints; + IWitnetRandomness public constant RNG = + IWitnetRandomness(0xC0FFEE98AD1434aCbDB894BbB752e138c1006fAB); + + IERC20 public cUSD; + IERC20 public usdt; + IERC20 public miles; + + struct RaffleRound { + // --- MUST MATCH V1/V2 EXACTLY (order & types) --- + uint256 id; + uint256 startTime; + uint256 endTime; + uint32 maxTickets; + IERC20 rewardToken; + uint256 rewardPool; + uint256 ticketCostPoints; + address[] participants; + bool isActive; + bool winnerSelected; + mapping(address => uint32) tickets; + uint32 totalTickets; + address winner; // <-- keep legacy slot! + uint256 randomBlock; // <-- keep legacy slot! + + // --- V3 APPENDS ONLY (safe) --- + address[] winners; // new + uint8 raffleType; // new + string rewardURI; +} + + + uint256 public roundIdCounter; + mapping(uint256 => RaffleRound) private rounds; + mapping(address => uint256) private _reserved; // token => reserved amount + + event Withdraw(address indexed token, address indexed to, uint256 amount); + event OwnershipTransferred( + address indexed previousOwner, + address indexed newOwner + ); + + event RoundCreated( + uint256 indexed roundId, + uint256 startTime, + uint256 endTime, + uint256 rewardPool, + IERC20 rewardToken, + uint256 maxTickets, + uint256 ticketCostPoints, + uint8 roundType + ); + event ParticipantJoined( + uint256 indexed roundId, + address indexed participant, + uint256 tickets + ); + event RandomnessRequested(uint256 indexed roundId, uint256 witnetBlock); + event WinnerSelected( + uint256 indexed roundId, + address winner, + uint256 reward + ); + + event MultiWinnersSelected( + uint256 indexed roundId, + address[] winners, + uint256[] amounts + ); + event RaffleClosed(uint256 indexed roundId); + + error Unauthorized(); + mapping(address => bool) public minters; + + modifier onlyOwner() { + require(msg.sender == owner, "Raffle: not owner"); + _; + } + modifier onlyAllowed() { + if (msg.sender != owner && !minters[msg.sender]) revert Unauthorized(); + _; + } + modifier roundExists(uint256 _roundId) { + require(rounds[_roundId].id != 0, "Raffle: round does not exist"); + _; + } + + function initialize( + address _miniPoints, + address _cUSD, + address _usdt, + address prize, + address _owner + ) public initializer { + __UUPSUpgradeable_init(); + __ReentrancyGuard_init(); + require(_miniPoints != address(0), "invalid MiniPoints"); + miniPoints = IMiniPoints(_miniPoints); + miles = IERC20(_miniPoints); + cUSD = IERC20(_cUSD); + usdt = IERC20(_usdt); + prizeNFT = prize; + owner = _owner; + } + + function setMinter(address who, bool enabled) external onlyOwner { + require(who != address(0), "Zero addr"); + minters[who] = enabled; + } + + function createRaffleRound( + uint256 _startTime, + uint256 _duration, + uint32 _maxTickets, + address _token, + uint8 _raffleType, + uint256 _rewardPool, + uint256 _ticketCostPoints, + string memory _rewardURI + ) external onlyAllowed { + require(_duration > 0 && _maxTickets > 0, "Raffle: bad params"); + require(_startTime >= block.timestamp, "Raffle: start in past"); + require(address(_token) != address(0), "Raffle: zero token"); + // Only 0/1/2 supported unless you implement physical path: + require(_raffleType <= 3, "Raffle: type unsupported"); + if (_raffleType != 3 && _rewardPool == 0) + revert("Raffle: 0 Rewards for Digital Cash/Miles Raffle"); + + + if (_token != address(miles) && _token !=prizeNFT) { + IERC20(_token).safeTransferFrom(msg.sender, address(this), _rewardPool); + _reserved[address(_token)] += _rewardPool; + } + roundIdCounter++; + RaffleRound storage r = rounds[roundIdCounter]; + r.id = roundIdCounter; + r.startTime = _startTime; + r.endTime = _startTime + _duration; + r.maxTickets = _maxTickets; + if(_token != prizeNFT){ + r.rewardToken = IERC20(_token); + } + else{ + r.rewardToken = IERC20(address(0)); // dummy placeholder for physical prize + } + r.rewardPool = _rewardPool; + r.ticketCostPoints = _ticketCostPoints; + r.isActive = true; + r.raffleType = _raffleType; + r.rewardURI = _rewardURI; + + emit RoundCreated( + r.id, + r.startTime, + r.endTime, + r.rewardPool, + r.rewardToken, + r.maxTickets, + r.ticketCostPoints, + r.raffleType + ); + } + + function joinRaffle( + uint256 _roundId, + uint32 _ticketCount + ) external roundExists(_roundId) nonReentrant { + RaffleRound storage r = rounds[_roundId]; + require(r.isActive, "Raffle: inactive round"); + require( + block.timestamp >= r.startTime && block.timestamp <= r.endTime, + "Raffle: not in timeframe" + ); + require( + r.totalTickets + _ticketCount <= r.maxTickets, + "Raffle: max tickets reached" + ); + + uint256 cost = r.ticketCostPoints * _ticketCount; + require( + miniPoints.balanceOf(msg.sender) >= cost, + "Raffle: insufficient points" + ); + miniPoints.burn(msg.sender, cost); + + if (r.tickets[msg.sender] == 0) { + r.participants.push(msg.sender); + } + r.tickets[msg.sender] += _ticketCount; + r.totalTickets += _ticketCount; + + emit ParticipantJoined(_roundId, msg.sender, _ticketCount); + } + + function requestRoundRandomness( + uint256 _roundId + ) external payable roundExists(_roundId) { + RaffleRound storage r = rounds[_roundId]; + require(r.randomBlock == 0, "Raffle: randomness requested"); + uint256 usedFee = RNG.randomize{value: msg.value}(); + r.randomBlock = block.number; + if (usedFee < msg.value) { + payable(msg.sender).transfer(msg.value - usedFee); + } + emit RandomnessRequested(_roundId, r.randomBlock); + } + + function drawWinner( + uint256 _roundId + ) external virtual nonReentrant roundExists(_roundId) { + RaffleRound storage r = rounds[_roundId]; + require(r.isActive, "Raffle: inactive round"); + require(!r.winnerSelected, "Raffle: already drawn"); + require( + block.timestamp > r.endTime || r.totalTickets == r.maxTickets, + "Raffle: unfinished" + ); + uint256 threshold = (uint256(r.maxTickets) * 20) / 100; + require(r.totalTickets >= threshold, "Raffle: threshold not met"); + require( + r.randomBlock != 0 && RNG.isRandomized(r.randomBlock), + "Raffle: randomness pending" + ); + + if (address(r.rewardToken) != address(miles)) { + _reserved[address(r.rewardToken)] -= r.rewardPool; + } + + if (r.raffleType == 0 /*single Winner */) { + _singleWinner(_roundId, r); + } else if (r.raffleType == 1 || r.raffleType == 2 /*3 winners */) { + _multipleWinners(_roundId, r); + } else { + _physicalWinner(_roundId, r); + } + } + + /// @notice Close an under-subscribed raffle after its endTime and refund all MiniPoints. + /// @dev Anyone can call once time has passed; requires <20% tickets sold. + function closeRaffle( + uint256 _roundId + ) external virtual nonReentrant roundExists(_roundId) { + RaffleRound storage round = rounds[_roundId]; + require(round.isActive, "Raffle: inactive"); + require(block.timestamp > round.endTime, "Raffle: not ended"); + + // must be below 20% of maxTickets + require( + round.totalTickets * 100 < uint256(round.maxTickets) * 20, + "Raffle: threshold met" + ); + + // refund each participant their spent points + round.isActive = false; + for (uint256 i = 0; i < round.participants.length; i++) { + address player = round.participants[i]; + uint32 bought = round.tickets[player]; + if (bought > 0) { + uint256 refundAmount = uint256(bought) * round.ticketCostPoints; + // mint the same amount back + miniPoints.mint(player, refundAmount); + // zero out tickets to avoid re-entry + round.tickets[player] = 0; + } + } + + // mark closed + + emit RaffleClosed(_roundId); + } + + function _selectByIndex( + RaffleRound storage r, + uint256 index + ) internal view returns (address) { + uint256 cum; + for (uint i; i < r.participants.length; i++) { + address p = r.participants[i]; + uint32 t = r.tickets[p]; + if (index < cum + t) return p; + cum += t; + } + revert("Raffle: index overflow"); + } + + function getActiveRound( + uint256 _roundId + ) + external + view + returns ( + uint256 roundId, + uint256 startTime, + uint256 endTime, + uint32 maxTickets, + uint32 totalTickets, + IERC20 rewardToken, + uint256 rewardPool, + uint256 ticketCostPoints, + bool winnerSelected + ) + { + RaffleRound storage r = rounds[_roundId]; + require(r.isActive, "Raffle: inactive"); + return ( + _roundId, + r.startTime, + r.endTime, + r.maxTickets, + r.totalTickets, + r.rewardToken, + r.rewardPool, + r.ticketCostPoints, + r.winnerSelected + ); + } + + function transferOwnership(address newOwner) external onlyOwner { + require(newOwner != address(0), "Owner: zero addr"); + emit OwnershipTransferred(owner, newOwner); + owner = newOwner; + } + + function _singleWinner(uint roundId, RaffleRound storage r) internal { + uint256 pick = RNG.random(r.totalTickets, 0, r.randomBlock); + address winner = _selectByIndex(r, pick); + r.winners.push(winner); + r.isActive = false; + r.winnerSelected = true; + if (address(r.rewardToken) == address(miles)) { + miniPoints.mint(winner, r.rewardPool); + } else { + r.rewardToken.safeTransfer(winner, r.rewardPool); + } + + emit WinnerSelected(roundId, winner, r.rewardPool); + } + + function _physicalWinner(uint roundId, RaffleRound storage r) internal { + uint256 pick = RNG.random(r.totalTickets, 0, r.randomBlock); + address winner = _selectByIndex(r, pick); + + // finalize draw + r.winners.push(winner); + r.isActive = false; + r.winnerSelected = true; + + // mint voucher NFT with default 30d (or pass custom seconds & URI) + PhysicalPrizeNFT(prizeNFT).mintTo(winner, uint64(roundId), 0, r.rewardURI); + + emit WinnerSelected(roundId, winner, 1); // “1” to signal a 1-of-1 physical voucher +} + + + function _multipleWinners(uint roundId, RaffleRound storage r) internal { + uint16[] memory split; + if (r.raffleType == 1) { + // triple: 50/30/20 + split = new uint16[](3); + split[0] = 50; + split[1] = 30; + split[2] = 20; + } else if (r.raffleType == 2) { + // quintuple: 50/25/15/10/10 + split = new uint16[](5); + split[0] = 50; + split[1] = 25; + split[2] = 15; + split[3] = 10; + split[4] = 10; + } else { + revert("Raffle: invalid raffleType"); + } + + // draw unique winners + address[] memory winnersArr = new address[](split.length); + uint256 count = 0; + uint256 attempts = 0; + while (count < split.length && attempts < split.length * 16) { + // generous cap to avoid long loops + // vary the salt so RNG changes each attempt + uint256 pick = RNG.random( + r.totalTickets, + attempts + 1, + r.randomBlock + ); + address w = _selectByIndex(r, pick); + + // ensure uniqueness among already-picked winners + bool dup = false; + for (uint256 j = 0; j < count; j++) { + if (winnersArr[j] == w) { + dup = true; + break; + } + } + if (!dup) { + winnersArr[count] = w; + r.winners.push(w); // persist to storage + count++; + } + attempts++; + } + require(count > 0, "Raffle: no unique winners"); + + // compute amounts using (possibly truncated) split and re-normalize; + uint16 sumPerc = 0; + for (uint256 i = 0; i < count; i++) sumPerc += split[i]; + + uint256[] memory amounts = new uint256[](count); + uint256 running = 0; + if (count == 1) { + amounts[0] = r.rewardPool; // single unique winner fallback + } else { + for (uint256 i = 0; i < count - 1; i++) { + // round down each amount; leftover goes to last winner + amounts[i] = + (r.rewardPool * uint256(split[i])) / + uint256(sumPerc); + running += amounts[i]; + } + amounts[count - 1] = r.rewardPool - running; // give remainder to the last + } + + // payout + + // finalize round + r.isActive = false; + r.winnerSelected = true; + + if (address(r.rewardToken) == address(miles)) { + for (uint256 i = 0; i < count; i++) { + miniPoints.mint(winnersArr[i], amounts[i]); + } + } else { + for (uint256 i = 0; i < count; i++) { + r.rewardToken.safeTransfer(winnersArr[i], amounts[i]); + } + } + + address[] memory winnersTrim = new address[](count); + for (uint256 i; i < count; i++) winnersTrim[i] = winnersArr[i]; + emit MultiWinnersSelected(roundId, winnersTrim, amounts); + } + + function setPrizeNft(address _prizeNft) external onlyOwner { + prizeNFT = _prizeNft; } + + + /// @notice Owner withdraws stuck tokens (USDT, cUSD, etc.) from contract + function withdraw( + address token, + address to, + uint256 amount + ) external onlyOwner { + require(to != address(0), "Withdraw: zero addr"); + require(amount > 0, "Withdraw: zero amount"); + uint256 bal = IERC20(token).balanceOf(address(this)); + uint256 reserved = _reserved[token]; + require( + bal > reserved && amount <= bal - reserved, + "Withdraw: reserved" + ); + IERC20(token).safeTransfer(to, amount); + emit Withdraw(token, to, amount); + } + + function ticketsOf( + uint256 _roundId, + address user + ) external view returns (uint32) { + return rounds[_roundId].tickets[user]; + } + + function participantsOf( + uint256 _roundId + ) external view returns (address[] memory) { + return rounds[_roundId].participants; + } + + function winnersOf( + uint256 _roundId + ) external view returns (address[] memory) { + return rounds[_roundId].winners; + } + + function _authorizeUpgrade( + address newImplementation + ) internal override onlyOwner {} + + uint256[50] private __gap; +} diff --git a/packages/hardhat/contracts/MiniRaffleV4.sol b/packages/hardhat/contracts/MiniRaffleV4.sol new file mode 100644 index 0000000..afdbb71 --- /dev/null +++ b/packages/hardhat/contracts/MiniRaffleV4.sol @@ -0,0 +1,673 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "./MiniPoints.sol"; +import "./physicalNFT.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "witnet-solidity-bridge/contracts/interfaces/IWitnetRandomness.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol"; +import "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; + +contract AkibaRaffleV4 is UUPSUpgradeable, ReentrancyGuardUpgradeable { + using SafeERC20 for IERC20; + + // ---- MUST MATCH V1/V2/V3 ORDER EXACTLY ---- + address public owner; + IMiniPoints public miniPoints; + IWitnetRandomness public constant RNG = + IWitnetRandomness(0xC0FFEE98AD1434aCbDB894BbB752e138c1006fAB); + + // V4: upper bound where direct linear scan is still acceptable + uint256 public constant MAX_DIRECT_TICKETS = 25_000; + + IERC20 public cUSD; + IERC20 public usdt; + IERC20 public miles; + + struct RaffleRound { + uint256 id; + uint256 startTime; + uint256 endTime; + uint32 maxTickets; + IERC20 rewardToken; + uint256 rewardPool; + uint256 ticketCostPoints; + address[] participants; + bool isActive; + bool winnerSelected; + mapping(address => uint32) tickets; + uint32 totalTickets; + address winner; + uint256 randomBlock; + + // V3 appends (OK) + address[] winners; + uint8 raffleType; + string rewardURI; + } + + uint256 public roundIdCounter; + mapping(uint256 => RaffleRound) private rounds; // visibility change is OK + mapping(address => bool) public minters; + + // ---- V3 NEW STATE (append-only, AFTER the gap originally) ---- + // These were already live in V3: + address public prizeNFT; + mapping(address => uint256) private _reserved; + + // ---- V4 NEW STATE (append-only, consuming 2 slots from __gap) ---- + + struct RoundChunk { + uint32 first; // index into r.participants + uint32 last; // inclusive + uint32 ticketsInChunk; // sum of tickets in [first, last] + } + + // roundId => chunks covering participants[first..last] + mapping(uint256 => RoundChunk[]) private _roundChunks; + // roundId => whether chunks are finalized & consistent + mapping(uint256 => bool) private _chunksFinalized; + + event Withdraw(address indexed token, address indexed to, uint256 amount); + event OwnershipTransferred( + address indexed previousOwner, + address indexed newOwner + ); + + event RoundCreated( + uint256 indexed roundId, + uint256 startTime, + uint256 endTime, + uint256 rewardPool, + IERC20 rewardToken, + uint256 maxTickets, + uint256 ticketCostPoints, + uint8 roundType + ); + event ParticipantJoined( + uint256 indexed roundId, + address indexed participant, + uint256 tickets + ); + event RandomnessRequested(uint256 indexed roundId, uint256 witnetBlock); + event WinnerSelected( + uint256 indexed roundId, + address winner, + uint256 reward + ); + + event MultiWinnersSelected( + uint256 indexed roundId, + address[] winners, + uint256[] amounts + ); + event RaffleClosed(uint256 indexed roundId); + + error Unauthorized(); + + modifier onlyOwner() { + require(msg.sender == owner, "Raffle: not owner"); + _; + } + + modifier onlyAllowed() { + if (msg.sender != owner && !minters[msg.sender]) revert Unauthorized(); + _; + } + + modifier roundExists(uint256 _roundId) { + require(rounds[_roundId].id != 0, "Raffle: round does not exist"); + _; + } + + function initialize( + address _miniPoints, + address _cUSD, + address _usdt, + address prize, + address _owner + ) public initializer { + __UUPSUpgradeable_init(); + __ReentrancyGuard_init(); + require(_miniPoints != address(0), "invalid MiniPoints"); + miniPoints = IMiniPoints(_miniPoints); + miles = IERC20(_miniPoints); + cUSD = IERC20(_cUSD); + usdt = IERC20(_usdt); + prizeNFT = prize; + owner = _owner; + } + + // kept for backwards compatibility — already live in V3 + function initializeV3(address _prizeNft) external reinitializer(3) { + prizeNFT = _prizeNft; + } + + function setMinter(address who, bool enabled) external onlyOwner { + require(who != address(0), "Zero addr"); + minters[who] = enabled; + } + + function createRaffleRound( + uint256 _startTime, + uint256 _duration, + uint32 _maxTickets, + address _token, + uint8 _raffleType, + uint256 _rewardPool, + uint256 _ticketCostPoints, + string memory _rewardURI + ) external onlyAllowed { + require(_duration > 0 && _maxTickets > 0, "Raffle: bad params"); + require(_startTime >= block.timestamp, "Raffle: start in past"); + require(address(_token) != address(0), "Raffle: zero token"); + // 0 = single, 1 = top-3, 2 = top-5, 3 = physical + require(_raffleType <= 3, "Raffle: type unsupported"); + if (_raffleType != 3 && _rewardPool == 0) { + revert("Raffle: 0 Rewards for Digital Cash/Miles Raffle"); + } + + if (_token != address(miles) && _token != prizeNFT) { + IERC20(_token).safeTransferFrom(msg.sender, address(this), _rewardPool); + _reserved[address(_token)] += _rewardPool; + } + + roundIdCounter++; + RaffleRound storage r = rounds[roundIdCounter]; + r.id = roundIdCounter; + r.startTime = _startTime; + r.endTime = _startTime + _duration; + r.maxTickets = _maxTickets; + + if (_token != prizeNFT) { + r.rewardToken = IERC20(_token); + } else { + // dummy placeholder for physical prize + r.rewardToken = IERC20(address(0)); + } + + r.rewardPool = _rewardPool; + r.ticketCostPoints = _ticketCostPoints; + r.isActive = true; + r.raffleType = _raffleType; + r.rewardURI = _rewardURI; + + emit RoundCreated( + r.id, + r.startTime, + r.endTime, + r.rewardPool, + r.rewardToken, + r.maxTickets, + r.ticketCostPoints, + r.raffleType + ); + } + + function joinRaffle( + uint256 _roundId, + uint32 _ticketCount + ) external roundExists(_roundId) nonReentrant { + RaffleRound storage r = rounds[_roundId]; + require(r.isActive, "Raffle: inactive round"); + require( + block.timestamp >= r.startTime && block.timestamp <= r.endTime, + "Raffle: not in timeframe" + ); + require( + r.totalTickets + _ticketCount <= r.maxTickets, + "Raffle: max tickets reached" + ); + + uint256 cost = r.ticketCostPoints * _ticketCount; + require( + miniPoints.balanceOf(msg.sender) >= cost, + "Raffle: insufficient points" + ); + miniPoints.burn(msg.sender, cost); + + if (r.tickets[msg.sender] == 0) { + r.participants.push(msg.sender); + } + r.tickets[msg.sender] += _ticketCount; + r.totalTickets += _ticketCount; + + emit ParticipantJoined(_roundId, msg.sender, _ticketCount); + } + + function requestRoundRandomness( + uint256 _roundId + ) external payable roundExists(_roundId) { + RaffleRound storage r = rounds[_roundId]; + require(r.randomBlock == 0, "Raffle: randomness requested"); + uint256 usedFee = RNG.randomize{value: msg.value}(); + r.randomBlock = block.number; + if (usedFee < msg.value) { + payable(msg.sender).transfer(msg.value - usedFee); + } + emit RandomnessRequested(_roundId, r.randomBlock); + } + + function drawWinner( + uint256 _roundId + ) external virtual nonReentrant roundExists(_roundId) { + RaffleRound storage r = rounds[_roundId]; + require(r.isActive, "Raffle: inactive round"); + require(!r.winnerSelected, "Raffle: already drawn"); + require( + block.timestamp > r.endTime || r.totalTickets == r.maxTickets, + "Raffle: unfinished" + ); + uint256 threshold = (uint256(r.maxTickets) * 20) / 100; + require(r.totalTickets >= threshold, "Raffle: threshold not met"); + require( + r.randomBlock != 0 && RNG.isRandomized(r.randomBlock), + "Raffle: randomness pending" + ); + + // Only adjust reserved for real ERC20 reward pools (not miles, not physical) + if ( + address(r.rewardToken) != address(miles) && + address(r.rewardToken) != address(0) + ) { + _reserved[address(r.rewardToken)] -= r.rewardPool; + } + + if (r.raffleType == 0 /* single winner */) { + _singleWinner(_roundId, r); + } else if (r.raffleType == 1 || r.raffleType == 2 /* multi */) { + _multipleWinners(_roundId, r); + } else { + _physicalWinner(_roundId, r); + } + } + + /// @notice Close an under-subscribed raffle after its endTime and refund all MiniPoints. + /// @dev Anyone can call once time has passed; requires <20% tickets sold. + function closeRaffle( + uint256 _roundId + ) external virtual nonReentrant roundExists(_roundId) { + RaffleRound storage round = rounds[_roundId]; + require(round.isActive, "Raffle: inactive"); + require(block.timestamp > round.endTime, "Raffle: not ended"); + + // must be below 20% of maxTickets + require( + round.totalTickets * 100 < uint256(round.maxTickets) * 20, + "Raffle: threshold met" + ); + + // refund each participant their spent points + round.isActive = false; + for (uint256 i = 0; i < round.participants.length; i++) { + address player = round.participants[i]; + uint32 bought = round.tickets[player]; + if (bought > 0) { + uint256 refundAmount = uint256(bought) * round.ticketCostPoints; + miniPoints.mint(player, refundAmount); + round.tickets[player] = 0; + } + } + + emit RaffleClosed(_roundId); + } + + function _selectByIndex( + RaffleRound storage r, + uint256 index + ) internal view returns (address) { + uint256 cum; + for (uint256 i; i < r.participants.length; i++) { + address p = r.participants[i]; + uint32 t = r.tickets[p]; + if (index < cum + t) return p; + cum += t; + } + revert("Raffle: index overflow"); + } + + /// @dev V4 helper: select a winner address using chunking when needed. + /// - If chunks are not finalized and totalTickets <= MAX_DIRECT_TICKETS: + /// fall back to _selectByIndex (original behavior). + /// - If chunks are not finalized and totalTickets > MAX_DIRECT_TICKETS: + /// revert and require chunk building. + /// - If chunks are finalized: + /// use 2-level selection: chunk -> participant within chunk. + function _pickTicketWinner( + uint256 roundId, + RaffleRound storage r, + uint256 salt + ) internal view returns (address) { + require(r.totalTickets > 0, "Raffle: no tickets"); + + uint256 pick = RNG.random(r.totalTickets, salt, r.randomBlock); + + if (!_chunksFinalized[roundId]) { + if (r.totalTickets <= MAX_DIRECT_TICKETS) { + // Small round: original behavior + return _selectByIndex(r, pick); + } else { + // Large round: force chunk building + revert("Raffle: chunks required"); + } + } + + RoundChunk[] storage chunks = _roundChunks[roundId]; + require(chunks.length > 0, "Raffle: no chunks"); + + uint256 cum = 0; + uint256 chunkIdx = 0; + + // Determine which chunk the global index falls into + for (; chunkIdx < chunks.length; chunkIdx++) { + uint256 nextCum = cum + chunks[chunkIdx].ticketsInChunk; + if (pick < nextCum) { + break; + } + cum = nextCum; + } + require(chunkIdx < chunks.length, "Raffle: chunk overflow"); + + // Offset within this chunk + uint256 offset = pick - cum; + RoundChunk storage c = chunks[chunkIdx]; + + uint256 localCum = 0; + for (uint256 i = c.first; i <= c.last; i++) { + address p = r.participants[i]; + uint32 t = r.tickets[p]; + if (offset < localCum + t) { + return p; + } + localCum += t; + } + + revert("Raffle: local index overflow"); + } + + /// @notice V4: build ticket chunks for a round in batches. + /// @dev Call multiple times until it reverts with "Raffle: all participants chunked". + /// `batchSize` should be chosen to fit comfortably within gas (e.g. 200–500). + function buildChunks( + uint256 roundId, + uint32 batchSize + ) external onlyAllowed roundExists(roundId) { + require(batchSize > 0, "Raffle: batchSize=0"); + + RaffleRound storage r = rounds[roundId]; + require(block.timestamp > r.endTime, "Raffle: not ended"); + require(!r.winnerSelected, "Raffle: already drawn"); + require(!_chunksFinalized[roundId], "Raffle: chunks finalized"); + + RoundChunk[] storage chunks = _roundChunks[roundId]; + + // Determine starting index in participants[] + uint32 start = 0; + if (chunks.length > 0) { + start = chunks[chunks.length - 1].last + 1; + } + + uint32 pLen = uint32(r.participants.length); + require(start < pLen, "Raffle: all participants chunked"); + + uint32 end = start + batchSize - 1; + if (end >= pLen) { + end = pLen - 1; + } + + uint32 ticketsInChunk = 0; + for (uint32 i = start; i <= end; i++) { + address p = r.participants[i]; + ticketsInChunk += r.tickets[p]; + } + + chunks.push( + RoundChunk({ + first: start, + last: end, + ticketsInChunk: ticketsInChunk + }) + ); + } + + /// @notice V4: finalize chunks for a round, ensuring coverage of all tickets. + /// @dev Must be called after `buildChunks` has fully covered participants[]. + function finalizeChunks( + uint256 roundId + ) external onlyAllowed roundExists(roundId) { + RaffleRound storage r = rounds[roundId]; + RoundChunk[] storage chunks = _roundChunks[roundId]; + + require(chunks.length > 0, "Raffle: no chunks"); + require(!_chunksFinalized[roundId], "Raffle: chunks already finalized"); + require(!r.winnerSelected, "Raffle: already drawn"); + + uint256 sum; + for (uint256 i = 0; i < chunks.length; i++) { + sum += chunks[i].ticketsInChunk; + } + require(sum == r.totalTickets, "Raffle: ticket sum mismatch"); + + _chunksFinalized[roundId] = true; + } + + /// @notice Optional helper for off-chain inspection of chunks. + function getChunks( + uint256 roundId + ) external view returns (RoundChunk[] memory) { + return _roundChunks[roundId]; + } + + function getActiveRound( + uint256 _roundId + ) + external + view + returns ( + uint256 roundId, + uint256 startTime, + uint256 endTime, + uint32 maxTickets, + uint32 totalTickets, + IERC20 rewardToken, + uint256 rewardPool, + uint256 ticketCostPoints, + bool winnerSelected + ) + { + RaffleRound storage r = rounds[_roundId]; + require(r.isActive, "Raffle: inactive"); + return ( + _roundId, + r.startTime, + r.endTime, + r.maxTickets, + r.totalTickets, + r.rewardToken, + r.rewardPool, + r.ticketCostPoints, + r.winnerSelected + ); + } + + function transferOwnership(address newOwner) external onlyOwner { + require(newOwner != address(0), "Owner: zero addr"); + emit OwnershipTransferred(owner, newOwner); + owner = newOwner; + } + + function _singleWinner( + uint256 roundId, + RaffleRound storage r + ) internal { + address winner = _pickTicketWinner(roundId, r, 0); + + r.winners.push(winner); + r.isActive = false; + r.winnerSelected = true; + + if (address(r.rewardToken) == address(miles)) { + miniPoints.mint(winner, r.rewardPool); + } else if (address(r.rewardToken) != address(0)) { + r.rewardToken.safeTransfer(winner, r.rewardPool); + } + + emit WinnerSelected(roundId, winner, r.rewardPool); + } + + function _physicalWinner( + uint256 roundId, + RaffleRound storage r + ) internal { + address winner = _pickTicketWinner(roundId, r, 0); + + r.winners.push(winner); + r.isActive = false; + r.winnerSelected = true; + + PhysicalPrizeNFT(prizeNFT).mintTo( + winner, + uint64(roundId), + 0, // default expiry or handled at NFT level + r.rewardURI + ); + + // “1” to signal a 1-of-1 physical voucher in the event + emit WinnerSelected(roundId, winner, 1); + } + + function _multipleWinners( + uint256 roundId, + RaffleRound storage r + ) internal { + uint16[] memory split; + if (r.raffleType == 1) { + // triple: 50/30/20 + split = new uint16[](3); + split[0] = 50; + split[1] = 30; + split[2] = 20; + } else if (r.raffleType == 2) { + // quintuple: 50/25/15/10/10 + split = new uint16[](5); + split[0] = 50; + split[1] = 25; + split[2] = 15; + split[3] = 5; + split[4] = 5; + } else { + revert("Raffle: invalid raffleType"); + } + + address[] memory winnersArr = new address[](split.length); + uint256 count = 0; + uint256 attempts = 0; + + while (count < split.length && attempts < split.length * 16) { + // vary the salt so RNG changes each attempt + address w = _pickTicketWinner(roundId, r, attempts + 1); + + bool dup = false; + for (uint256 j = 0; j < count; j++) { + if (winnersArr[j] == w) { + dup = true; + break; + } + } + if (!dup) { + winnersArr[count] = w; + r.winners.push(w); // persist to storage + count++; + } + attempts++; + } + require(count > 0, "Raffle: no unique winners"); + + // compute amounts using (possibly truncated) split and re-normalize; + uint16 sumPerc = 0; + for (uint256 i = 0; i < count; i++) sumPerc += split[i]; + + uint256[] memory amounts = new uint256[](count); + uint256 running = 0; + if (count == 1) { + amounts[0] = r.rewardPool; // single unique winner fallback + } else { + for (uint256 i = 0; i < count - 1; i++) { + // round down each amount; leftover goes to last winner + amounts[i] = + (r.rewardPool * uint256(split[i])) / + uint256(sumPerc); + running += amounts[i]; + } + amounts[count - 1] = r.rewardPool - running; // give remainder to the last + } + + // finalize round + r.isActive = false; + r.winnerSelected = true; + + if (address(r.rewardToken) == address(miles)) { + for (uint256 i = 0; i < count; i++) { + miniPoints.mint(winnersArr[i], amounts[i]); + } + } else if (address(r.rewardToken) != address(0)) { + for (uint256 i = 0; i < count; i++) { + r.rewardToken.safeTransfer(winnersArr[i], amounts[i]); + } + } + + address[] memory winnersTrim = new address[](count); + for (uint256 i; i < count; i++) winnersTrim[i] = winnersArr[i]; + + emit MultiWinnersSelected(roundId, winnersTrim, amounts); + } + + function setPrizeNft(address _prizeNft) external onlyOwner { + prizeNFT = _prizeNft; + } + + /// @notice Owner withdraws stuck tokens (USDT, cUSD, etc.) from contract + function withdraw( + address token, + address to, + uint256 amount + ) external onlyOwner { + require(to != address(0), "Withdraw: zero addr"); + require(amount > 0, "Withdraw: zero amount"); + uint256 bal = IERC20(token).balanceOf(address(this)); + uint256 reserved = _reserved[token]; + require( + bal > reserved && amount <= bal - reserved, + "Withdraw: reserved" + ); + IERC20(token).safeTransfer(to, amount); + emit Withdraw(token, to, amount); + } + + function ticketsOf( + uint256 _roundId, + address user + ) external view returns (uint32) { + return rounds[_roundId].tickets[user]; + } + + function participantsOf( + uint256 _roundId + ) external view returns (address[] memory) { + return rounds[_roundId].participants; + } + + function winnersOf( + uint256 _roundId + ) external view returns (address[] memory) { + return rounds[_roundId].winners; + } + + function _authorizeUpgrade( + address newImplementation + ) internal override onlyOwner {} + + // originally uint256[50] __gap; now we consume 2 slots for the new mappings + uint256[48] private __gap; +} diff --git a/packages/hardhat/contracts/physicalNFT.sol b/packages/hardhat/contracts/physicalNFT.sol new file mode 100644 index 0000000..d94f0ec --- /dev/null +++ b/packages/hardhat/contracts/physicalNFT.sol @@ -0,0 +1,150 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/access/Ownable.sol"; +import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol"; + +/// @notice Minimal interface your Raffle uses (keep for compatibility). +interface IPrizeNFT { + function mintTo(address to) external returns (uint256); +} + +/// @title PhysicalPrizeNFT +/// @dev Voucher-style ERC721 used to redeem a physical prize. +/// - Raffle contract mints to the winner +/// - Winner must `claim()` before `expiry` +/// - If not claimed by expiry, owner can `revokeExpired()` and re-raffle +contract PhysicalPrizeNFT is ERC721URIStorage, Ownable { + // ---- Roles ---- + address public raffle; // AkibaRaffle proxy address allowed to mint + + // ---- Config ---- + uint256 public defaultClaimWindow = 30 days; // can be changed by owner + + // ---- Prize state ---- + struct Prize { + uint64 expiry; // unix timestamp when claim window ends + bool claimed; // winner marked as claimed + uint64 roundId; // optional: raffle round for UX/traceability + } + + // tokenId => prize info + mapping(uint256 => Prize) public prizeInfo; + + // simple incremental token id + uint256 private _nextId = 1; + + // ---- Events ---- + event RaffleSet(address indexed raffle); + event DefaultClaimWindowSet(uint256 seconds_); + event PrizeMinted(uint256 indexed tokenId, address indexed to, uint64 roundId, uint64 expiryTs, string tokenURI_); + event PrizeClaimed(uint256 indexed tokenId, address indexed claimer); + event PrizeRevoked(uint256 indexed tokenId); + + // ---- Modifiers ---- + modifier onlyRaffle() { + require(msg.sender == raffle, "PrizeNFT: not raffle"); + _; + } + + constructor(string memory name_, string memory symbol_) ERC721(name_, symbol_) {} + + // -------- Admin -------- + + function setRaffle(address raffle_) external onlyOwner { + require(raffle_ != address(0), "PrizeNFT: zero raffle"); + raffle = raffle_; + emit RaffleSet(raffle_); + } + + /// @notice Set default claim window (in seconds). E.g., 30 days = 30 * 86400 + function setDefaultClaimWindow(uint256 seconds_) external onlyOwner { + require(seconds_ > 0, "PrizeNFT: zero window"); + defaultClaimWindow = seconds_; + emit DefaultClaimWindowSet(seconds_); + } + + // -------- Minting (Raffle-only) -------- + + /// @notice Backwards-compatible mint with default window and empty URI. + function mintTo(address to) external onlyRaffle returns (uint256 tokenId) { + tokenId = _mintPrize(to, 0, 0, ""); + } + + /// @notice Preferred mint with per-round metadata and optional override window/URI. + /// @param to Winner address + /// @param roundId Optional: AkibaRaffle round id (0 if unused) + /// @param claimWindowSeconds 0 => use defaultClaimWindow; otherwise custom (e.g., 10 days) + /// @param tokenURI_ Optional metadata URI (empty string to skip) + function mintTo( + address to, + uint64 roundId, + uint256 claimWindowSeconds, + string memory tokenURI_ + ) external onlyRaffle returns (uint256 tokenId) { + tokenId = _mintPrize(to, roundId, claimWindowSeconds, tokenURI_); + } + + function _mintPrize( + address to, + uint64 roundId, + uint256 claimWindowSeconds, + string memory tokenURI_ + ) internal returns (uint256 tokenId) { + require(to != address(0), "PrizeNFT: zero to"); + + uint256 window = (claimWindowSeconds == 0) ? defaultClaimWindow : claimWindowSeconds; + require(window > 0, "PrizeNFT: bad window"); + + tokenId = _nextId++; + _safeMint(to, tokenId); + + if (bytes(tokenURI_).length != 0) { + _setTokenURI(tokenId, tokenURI_); + } + + uint64 expiryTs = uint64(block.timestamp + window); + prizeInfo[tokenId] = Prize({ + expiry: expiryTs, + claimed: false, + roundId: roundId + }); + + emit PrizeMinted(tokenId, to, roundId, expiryTs, tokenURI_); + } + + // -------- Claim / Revoke -------- + + /// @notice Winner claims the physical prize before expiry (on-chain acknowledgement). + function claim(uint256 tokenId) external { + require(ownerOf(tokenId) == msg.sender, "PrizeNFT: not owner"); + Prize storage p = prizeInfo[tokenId]; + require(!p.claimed, "PrizeNFT: already claimed"); + require(block.timestamp <= p.expiry, "PrizeNFT: expired"); + + p.claimed = true; + emit PrizeClaimed(tokenId, msg.sender); + } + + /// @notice After expiry and if unclaimed, owner can revoke (burn) to re-raffle. + function revokeExpired(uint256 tokenId) external onlyOwner { + Prize storage p = prizeInfo[tokenId]; + require(!p.claimed, "PrizeNFT: already claimed"); + require(block.timestamp > p.expiry, "PrizeNFT: not expired"); + + _burn(tokenId); + delete prizeInfo[tokenId]; + emit PrizeRevoked(tokenId); + } + + // -------- Views -------- + + function getPrize(uint256 tokenId) + external + view + returns (uint64 expiry, bool claimed, uint64 roundId) + { + Prize memory p = prizeInfo[tokenId]; + return (p.expiry, p.claimed, p.roundId); + } +} diff --git a/packages/hardhat/hardhat.config.ts b/packages/hardhat/hardhat.config.ts index 66fdad6..0439d55 100644 --- a/packages/hardhat/hardhat.config.ts +++ b/packages/hardhat/hardhat.config.ts @@ -23,35 +23,41 @@ const config: HardhatUserConfig = { }, etherscan: { - apiKey: { - alfajores: process.env.CELOSCAN_API_KEY ?? '', - celo: process.env.CELOSCAN_API_KEY ?? '', - sepolia: 'GG98NBUZX46RSPK26MDUA76KSVWIHHDPHI' - }, + apiKey: process.env.CELOSCAN_API_KEY ?? '', + customChains: [ { - chainId: 44_787, network: 'alfajores', + chainId: 44787, urls: { - apiURL: 'https://api-alfajores.celoscan.io/api', + apiURL: 'https://api-alfajores.celoscan.io/api', // CeloScan supports Etherscan-compatible API browserURL: 'https://alfajores.celoscan.io', }, }, { - chainId: 42_220, network: 'celo', + chainId: 42220, urls: { apiURL: 'https://api.celoscan.io/api', - browserURL: 'https://celoscan.io/', + browserURL: 'https://celoscan.io', }, }, - ], - }, + }, sourcify: { enabled: false, }, - solidity: '0.8.24', + solidity:{ + version: '0.8.24', + settings: { + // These three are the big wins for code size + optimizer: { enabled: true, runs: 200 }, // try 200, 1, or 800 depending on size vs. runtime gas + viaIR: true, // IR pipeline shrinks bytecode a lot + metadata: { bytecodeHash: "none" }, // smaller deploy bytecode (runtime size is the EIP-170 limit) + // evmVersion: "paris", // uncomment if you want to pin EVM version + }, +} + }; export default config; diff --git a/packages/hardhat/ignition/deployments/chain-44787/deployed_addresses.json b/packages/hardhat/ignition/deployments/chain-44787/deployed_addresses.json index c7ea371..47ade9c 100644 --- a/packages/hardhat/ignition/deployments/chain-44787/deployed_addresses.json +++ b/packages/hardhat/ignition/deployments/chain-44787/deployed_addresses.json @@ -9,5 +9,11 @@ "MiniRaffles#MiniRaffle": "0xA1F1Cd3b90f49c9d44ed324C69869df139616d55", "MiniRafflesForNiko#MiniRaffle": "0x8762277745b6f05ceb3F2c2E85FF3062A57482B6", "MiniRaffleModule#MiniRaffle": "0xA678CaCD19485f37ebe886a5fbE2cE94E0994497", - "MiniRaffleModule#ERC1967Proxy": "0x917124eea88426c9D66c21bA155b925E8F38f8aA" + "MiniRaffleModule#ERC1967Proxy": "0x917124eea88426c9D66c21bA155b925E8F38f8aA", + "Physical#PhysicalPrizeNFT": "0x8F60907f41593d4B41f5e0cEa48415cd61854a79", + "points#AkibaMiles": "0xd59AE111d976342ff58c6dE2B6f2b002415825C1", + "AMilesV3#akiba_impl": "0x10EA378Ea0429c27A892d9349C0cC5fC373bd9cb", + "AMilesV3#akiba_proxy": "0x72fEFD4e943475c5cB7Cf11753fE60d04aEb7ff0", + "AkibaRaffleV3_Upgrade#AkibaRaffleV3": "0x72fEFD4e943475c5cB7Cf11753fE60d04aEb7ff0", + "AkibaRaffleV3_Upgrade#akiba_impl_vNext": "0xb533CB94DeaBDd37F870E47510a03539C413CEFF" } diff --git a/packages/hardhat/ignition/deployments/chain-44787/journal.jsonl b/packages/hardhat/ignition/deployments/chain-44787/journal.jsonl index ca59083..969af90 100644 --- a/packages/hardhat/ignition/deployments/chain-44787/journal.jsonl +++ b/packages/hardhat/ignition/deployments/chain-44787/journal.jsonl @@ -59,4 +59,45 @@ {"futureId":"MiniRaffleModule#ERC1967Proxy","networkInteractionId":1,"nonce":173,"type":"TRANSACTION_PREPARE_SEND"} {"futureId":"MiniRaffleModule#ERC1967Proxy","networkInteractionId":1,"nonce":173,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"50001000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"1000000"}},"hash":"0x6541158d761e093366ab401454acbe35abe469e8e12d559f4b402e7a4354e53c"},"type":"TRANSACTION_SEND"} {"futureId":"MiniRaffleModule#ERC1967Proxy","hash":"0x6541158d761e093366ab401454acbe35abe469e8e12d559f4b402e7a4354e53c","networkInteractionId":1,"receipt":{"blockHash":"0x9432949b4834baae9a8e9769b4f3b16c16b76486f098224ef863d5670c1e1181","blockNumber":49479005,"contractAddress":"0x917124eea88426c9D66c21bA155b925E8F38f8aA","logs":[{"address":"0x917124eea88426c9D66c21bA155b925E8F38f8aA","data":"0x","logIndex":1,"topics":["0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b","0x000000000000000000000000a678cacd19485f37ebe886a5fbe2ce94e0994497"]},{"address":"0x917124eea88426c9D66c21bA155b925E8F38f8aA","data":"0x0000000000000000000000000000000000000000000000000000000000000001","logIndex":2,"topics":["0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} -{"futureId":"MiniRaffleModule#ERC1967Proxy","result":{"address":"0x917124eea88426c9D66c21bA155b925E8F38f8aA","type":"SUCCESS"},"type":"DEPLOYMENT_EXECUTION_STATE_COMPLETE"} \ No newline at end of file +{"futureId":"MiniRaffleModule#ERC1967Proxy","result":{"address":"0x917124eea88426c9D66c21bA155b925E8F38f8aA","type":"SUCCESS"},"type":"DEPLOYMENT_EXECUTION_STATE_COMPLETE"} +{"artifactId":"vaultToken#PhysicalPrizeNFT","constructorArgs":["Akiba Prize","AKIBA"],"contractName":"PhysicalPrizeNFT","dependencies":[],"from":"0xf20a5e1a4ca28d64f2c4a90998a41e8045288f48","futureId":"vaultToken#PhysicalPrizeNFT","futureType":"NAMED_ARTIFACT_CONTRACT_DEPLOYMENT","libraries":{},"strategy":"basic","strategyConfig":{},"type":"DEPLOYMENT_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"vaultToken#PhysicalPrizeNFT","networkInteraction":{"data":"0x6080604052346200036d57620023c2803803806200001d8162000372565b92833981016040828203126200036d5781516001600160401b0392908381116200036d57826200004f91830162000398565b90602092838201518581116200036d576200006b920162000398565b92815181811162000357576000938454916001948584811c941680156200034c575b8385101462000338578190601f94858111620002e5575b5083908583116001146200028157889262000275575b5050600019600383901b1c191690851b1785555b8551928311620002615783548481811c9116801562000256575b828210146200024257828111620001fa575b508091831160011462000194575083948293949262000188575b5050600019600383901b1c191690821b1781555b60078054336001600160a01b031982168117909255604051936001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a362278d00600955600b55611fb790816200040b8239f35b01519050388062000114565b90601f198316958486528286209286905b888210620001e25750508385969710620001c8575b505050811b01815562000128565b015160001960f88460031b161c19169055388080620001ba565b808785968294968601518155019501930190620001a5565b8486528186208380860160051c82019284871062000238575b0160051c019085905b8281106200022c575050620000fa565b8781550185906200021c565b9250819262000213565b634e487b7160e01b86526022600452602486fd5b90607f1690620000e8565b634e487b7160e01b85526041600452602485fd5b015190503880620000ba565b8880528489208894509190601f1984168a5b87828210620002ce5750508411620002b4575b505050811b018555620000ce565b015160001960f88460031b161c19169055388080620002a6565b8385015186558b9790950194938401930162000293565b9091508780528388208580850160051c8201928686106200032e575b918991869594930160051c01915b8281106200031f575050620000a4565b8a81558594508991016200030f565b9250819262000301565b634e487b7160e01b87526022600452602487fd5b93607f16936200008d565b634e487b7160e01b600052604160045260246000fd5b600080fd5b6040519190601f01601f191682016001600160401b038111838210176200035757604052565b919080601f840112156200036d5782516001600160401b0381116200035757602090620003ce601f8201601f1916830162000372565b928184528282870101116200036d5760005b818110620003f657508260009394955001015290565b8581018301518482018401528201620003e056fe6080604081815260048036101561001557600080fd5b600092833560e01c90816301ffc9a7146117235750806306fdde0314611672578063081812fc14611652578063095ea7b3146114e557806315ed71f21461143d57806323b872dd1461141857806333c1420a146113ef578063379607f5146112e35780633a9a7b3014610eab57806342842e0e14610e775780636352211e14610e4657806370a0823114610db0578063715018a614610d53578063719130dd14610bb9578063726a41cf14610b6b578063755edd17146107075780638da5cb5b146106de57806394e68040146106bf57806395d89b41146105d1578063a1099bf21461055c578063a22cb4651461048d578063b88d4fde14610400578063c87b56dd146102f1578063e4cc770514610261578063e985e9c51461020f5763f2fde38b1461014157600080fd5b3461020b57602036600319011261020b5761015a6117e9565b90610163611ae9565b6001600160a01b039182169283156101b9575050600754826bffffffffffffffffffffffff60a01b821617600755167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a380f35b906020608492519162461bcd60e51b8352820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152fd5b8280fd5b50503461025d578060031936011261025d5760ff8160209361022f6117e9565b610237611804565b6001600160a01b0391821683526005875283832091168252855220549151911615158152f35b5080fd5b50903461020b57602036600319011261020b5781359161027f611ae9565b82156102b75750816020917f347ecdfa5418bcb04b269780ec51b3b9e3ad44e824e2cc0f12cabdc0db8be8fb9360095551908152a180f35b6020606492519162461bcd60e51b835282015260156024820152745072697a654e46543a207a65726f2077696e646f7760581b6044820152fd5b50903461020b57602091826003193601126103fc573560008181526002602052604090205461032a906001600160a01b03161515611a77565b8352600682528083209281518094829080546103458161190e565b91828552600191886001821691826000146103d5575050600114610397575b50505061039393929161037891038661189b565b815161038381611880565b52519282849384528301906117a9565b0390f35b8552868520879350859291905b8284106103bd5750505082010181610378610393610364565b8054848b0186015289955088949093019281016103a4565b60ff19168782015293151560051b8601909301935084925061037891506103939050610364565b8380fd5b83823461025d57608036600319011261025d5761041b6117e9565b90610424611804565b91604435606435936001600160401b03851161048957366023860112156104895761045e61048194866024610486983693013591016118d7565b9261047161046c8433611b41565b611986565b61047c838383611c09565b611eb5565b611d77565b80f35b8580fd5b50903461020b578060031936011261020b576104a76117e9565b9060243591821515809303610558576001600160a01b0316923384146105165750338452600560205280842083855260205280842060ff1981541660ff8416179055519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a380f35b6020606492519162461bcd60e51b8352820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152fd5b8480fd5b503461020b57602036600319011261020b57918192358152600a602052206103938251916105898361184f565b546001600160401b0380821680855282861c60ff161515602080870182905260489490941c909216948601859052945194855290840152604083019190915281906060820190565b8284346106bc57806003193601126106bc578151918282600193600154946105f88661190e565b9182855260209687600182169182600014610695575050600114610639575b505050610393929161062a91038561189b565b519282849384528301906117a9565b9190869350600183527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf65b82841061067d575050508201018161062a610393610617565b8054848a018601528895508794909301928101610664565b60ff19168782015293151560051b8601909301935084925061062a91506103939050610617565b80fd5b50503461025d578160031936011261025d576020906009549051908152f35b50503461025d578160031936011261025d5760075490516001600160a01b039091168152602090f35b50903461020b57602092836003193601126106bc576107246117e9565b9260018060a01b039161073c83600854163314611a34565b83519261074884611880565b8184528516928315610b34576009548015610afa57600b549660001990818914610ae7579061081b610481888b8b9560028f60019860018501600b5580519561079087611880565b8d87526000868152600260205260409020546107b8906001600160a01b031615155b15611f3e565b6000868152600260205260409020546107db906001600160a01b031615156107b2565b8d52600382528c2080546001019055838c52528c8a2080546001600160a01b0319168d179055818c8b600080516020611f8b8339815191528180a4611d9b565b835161091b575b50504201928342116109085750917f59c6d4f742b53fdff9e328fc653cdd5789189080ca04c587ad5e2bcc6b15d18f916108ff87946001600160401b03809416938a6108be8a51926108738461184f565b8784528284018781528c85018881528b8952600a9094528c882094518554915160ff60401b19919093161668ffffffffffffffffff199091161790151560401b60ff60401b16178355565b5167ffffffffffffffff60481b82549160481b169067ffffffffffffffff60481b1916179055875193849384528a84015260608884015260608301906117a9565b0390a351908152f35b634e487b7160e01b835260119052602482fd5b6000898152600260205260409020546001600160a01b031615610a8d5788855260068a52878520918451916001600160401b038311610a7a578b90610960855461190e565b601f8111610a41575b508192601f85116001146109d857505050908061099b9287916109cd575b508160011b916000199060031b1c19161790565b90555b7ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7888751898152a13880610822565b905085015138610987565b8589528d892093919250601f1985169089908f5b8a848410610a2b5750505050908460019594939210610a13575b505050811b01905561099e565b8701519060f88460031b161c19169055388080610a06565b85015187559581019593840193918201916109ec565b610a6a90868a52838a20601f870160051c810191858810610a70575b601f0160051c0190611d0d565b38610969565b9091508190610a5d565b634e487b7160e01b875260418852602487fd5b875162461bcd60e51b81528087018b9052602e60248201527f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60448201526d32bc34b9ba32b73a103a37b5b2b760911b6064820152608490fd5b634e487b7160e01b855260118652602485fd5b855162461bcd60e51b815280850189905260146024820152735072697a654e46543a206261642077696e646f7760601b6044820152606490fd5b845162461bcd60e51b815280840188905260116024820152705072697a654e46543a207a65726f20746f60781b6044820152606490fd5b503461020b57602036600319011261020b57358252600a6020908152918190205481516001600160401b0380831682529282901c60ff1615159381019390935260481c166040820152606090f35b50903461020b576020806003193601126103fc57823592610bd8611ae9565b838552600a82526001600160401b0383862054610bfa60ff82871c16156119e8565b16421115610d1a578492918484600a93610c1383611ac3565b50610c1d83611ac3565b83835290845285822080546001600160a01b03199081169091556001600160a01b03909116808352600385528683208054600019019055838352600285528683208054909216909155600080516020611f8b8339815191528280a460068152610c888385205461190e565b610cbb575b848452528120557fe5e31c711eccb0a0fec1d483872536e3505e22d192c888d835301bb8d73097448280a280f35b8484526006815283838120610cd0815461190e565b80610cde575b505050610c8d565b82601f8211600114610cf6575050555b833880610cd6565b9091808252610d13601f868420940160051c840160018501611d0d565b5555610cee565b915162461bcd60e51b8152918201526015602482015274141c9a5e995391950e881b9bdd08195e1c1a5c9959605a1b6044820152606490fd5b83346106bc57806003193601126106bc57610d6c611ae9565b600780546001600160a01b0319811690915581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b5082903461025d57602036600319011261025d576001600160a01b03610dd46117e9565b16908115610df15760208480858581526003845220549051908152f35b608490602085519162461bcd60e51b8352820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152fd5b5091346106bc5760203660031901126106bc5750610e6660209235611ac3565b90516001600160a01b039091168152f35b50503461025d5761048161048691610e8e3661181a565b91925192610e9b84611880565b86845261047161046c8433611b41565b50903461020b57608036600319011261020b57610ec66117e9565b9260249283356001600160401b03918282168092036103fc576044359360643584811161025d573660238201121561025d57610f0a903690898186013591016118d7565b9160018060a01b03610f2181600854163314611a34565b89169586156112ad57806112a75750600954975b881561126e57600b5498600019808b1461125c5760018b01600b5589519b610f5c8d611880565b858d5260008c815260026020526040902054610f81906001600160a01b031615611f3e565b60008c815260026020526040902054610fa3906001600160a01b031615611f3e565b898652600360209081528b8720805460010190558c8752600281528b872080546001600160a01b0319168c1790559c8c808c89600080516020611f8b8339815191528180a4610ff192611d9b565b610ffa90611d77565b85516110a7575b5042019182421161109657505084927f59c6d4f742b53fdff9e328fc653cdd5789189080ca04c587ad5e2bcc6b15d18f9492896108be8c82996108ff9616978c80519561104d8761184f565b8a8752600a84880194828652838901978c8952835252209451166001600160401b0319855416178455511515839060ff60401b825491151560401b169060ff60401b1916179055565b634e487b7160e01b84526011905282fd5b60008b8152600260205260409020546001600160a01b031615611203578a855260068c52898520908651908982116111f1578d6110e4845461190e565b90601f82116111c3575b50508d8091601f841160011461115c575050908061112092889161115157508160011b916000199060031b1c19161790565b90555b7ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce78b8a518c8152a138611001565b905088015138610987565b9091601f198416858a52838a20938a905b8c8383106111ab57505050908460019594939210611193575b505050811b019055611123565b8a01519060f88460031b161c19169055388080611186565b6001859783949684930151815501960193019061116d565b8489528089206111ea92601f860160051c8201928610610a7057601f0160051c0190611d0d565b388e6110ee565b634e487b7160e01b8752604186528487fd5b895162461bcd60e51b81528085018d9052602e818501527f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60448201526d32bc34b9ba32b73a103a37b5b2b760911b6064820152608490fd5b634e487b7160e01b8552601184528285fd5b90601460649260208a519362461bcd60e51b8552840152820152735072697a654e46543a206261642077696e646f7760601b6044820152fd5b97610f35565b875162461bcd60e51b81526020818401526011818b0152705072697a654e46543a207a65726f20746f60781b6044820152606490fd5b503461020b57602036600319011261020b5780359161130183611ac3565b336001600160a01b03909116036113b657828452600a6020528084209182549161133060ff84831c16156119e8565b6001600160401b038316421161137f57505060ff60401b19166801000000000000000017905533907fbfb36529287d5a1dcbfbbc958f0a7337a1f5bca269edc737da0be1be702f22518380a380f35b906020606492519162461bcd60e51b83528201526011602482015270141c9a5e995391950e88195e1c1a5c9959607a1b6044820152fd5b906020606492519162461bcd60e51b83528201526013602482015272283934bd32a7232a1d103737ba1037bbb732b960691b6044820152fd5b50503461025d578160031936011261025d5760085490516001600160a01b039091168152602090f35b83346106bc5761048661142a3661181a565b9161143861046c8433611b41565b611c09565b503461020b57602036600319011261020b576114576117e9565b61145f611ae9565b6001600160a01b03169182156114aa575050600880546001600160a01b031916821790557f1b9ca247680a449da537757f5925ac6b546f3ac5872470f9d8dc14500696ceff8280a280f35b906020606492519162461bcd60e51b835282015260156024820152745072697a654e46543a207a65726f20726166666c6560581b6044820152fd5b503461020b578160031936011261020b576114fe6117e9565b6024359290916001600160a01b039190828061151987611ac3565b16941693808514611605578033149081156115e6575b501561157e57848652602052842080546001600160a01b0319168317905561155683611ac3565b167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258480a480f35b6020608492519162461bcd60e51b8352820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152fd5b90508652600560205281862033875260205260ff82872054163861152f565b506020608492519162461bcd60e51b8352820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152fd5b5091346106bc5760203660031901126106bc5750610e6660209235611948565b8284346106bc57806003193601126106bc57815191828283546116948161190e565b90818452602095600191876001821691826000146106955750506001146116c857505050610393929161062a91038561189b565b91908693508280527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5635b82841061170b575050508201018161062a610393610617565b8054848a0186015288955087949093019281016116f2565b9250503461020b57602036600319011261020b573563ffffffff60e01b811680910361020b5760209250632483248360e11b8114908115611766575b5015158152f35b6380ac58cd60e01b811491508115611798575b8115611787575b503861175f565b6301ffc9a760e01b14905038611780565b635b5e139f60e01b81149150611779565b919082519283825260005b8481106117d5575050826000602080949584010152601f8019910116010190565b6020818301810151848301820152016117b4565b600435906001600160a01b03821682036117ff57565b600080fd5b602435906001600160a01b03821682036117ff57565b60609060031901126117ff576001600160a01b039060043582811681036117ff579160243590811681036117ff579060443590565b606081019081106001600160401b0382111761186a57604052565b634e487b7160e01b600052604160045260246000fd5b602081019081106001600160401b0382111761186a57604052565b90601f801991011681019081106001600160401b0382111761186a57604052565b6001600160401b03811161186a57601f01601f191660200190565b9291926118e3826118bc565b916118f1604051938461189b565b8294818452818301116117ff578281602093846000960137010152565b90600182811c9216801561193e575b602083101461192857565b634e487b7160e01b600052602260045260246000fd5b91607f169161191d565b60008181526002602052604090205461196b906001600160a01b03161515611a77565b6000908152600460205260409020546001600160a01b031690565b1561198d57565b60405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201526c1c881bdc88185c1c1c9bdd9959609a1b6064820152608490fd5b156119ef57565b60405162461bcd60e51b815260206004820152601960248201527f5072697a654e46543a20616c726561647920636c61696d6564000000000000006044820152606490fd5b15611a3b57565b60405162461bcd60e51b81526020600482015260146024820152735072697a654e46543a206e6f7420726166666c6560601b6044820152606490fd5b15611a7e57565b60405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152606490fd5b6000908152600260205260409020546001600160a01b0316611ae6811515611a77565b90565b6007546001600160a01b03163303611afd57565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b906001600160a01b038080611b5584611ac3565b16931691838314938415611b88575b508315611b72575b50505090565b611b7e91929350611948565b1614388080611b6c565b909350600052600560205260406000208260005260205260ff604060002054169238611b64565b15611bb657565b60405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608490fd5b90611c3191611c1784611ac3565b6001600160a01b0393918416928492909183168414611baf565b16918215611cbc5781611c4e91611c4786611ac3565b1614611baf565b600080516020611f8b83398151915260008481526004602052604081206bffffffffffffffffffffffff60a01b9081815416905583825260036020526040822060001981540190558482526040822060018154019055858252600260205284604083209182541617905580a4565b60405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608490fd5b818110611d18575050565b60008155600101611d0d565b60809060208152603260208201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b60608201520190565b15611d7e57565b60405162461bcd60e51b815280611d9760048201611d24565b0390fd5b91929091803b15611eac57611de8936040519081630a85bd0160e11b9384825233600483015260009687602484015260448301526080606483015281878160209a8b9660848301906117a9565b03926001600160a01b03165af1849181611e6c575b50611e5b575050503d600014611e53573d611e17816118bc565b90611e25604051928361189b565b81528091833d92013e5b80519182611e505760405162461bcd60e51b815280611d9760048201611d24565b01fd5b506060611e2f565b6001600160e01b0319161492509050565b9091508581813d8311611ea5575b611e84818361189b565b8101031261055857516001600160e01b031981168103610558579038611dfd565b503d611e7a565b50915050600190565b9293919290803b15611f3457611f099460018060a01b039460405192839187630a85bd0160e11b9687855233600486015216602484015260448301526080606483015281806020998a9560848301906117a9565b03916000988991165af1849181611e6c5750611e5b575050503d600014611e53573d611e17816118bc565b5050915050600190565b15611f4557565b60405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606490fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa164736f6c6343000818000a00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000b416b696261205072697a650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005414b494241000000000000000000000000000000000000000000000000000000","id":1,"type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"artifactId":"Physical#PhysicalPrizeNFT","constructorArgs":["Akiba Prize","AKIBA"],"contractName":"PhysicalPrizeNFT","dependencies":[],"from":"0x03909bb1e9799336d4a8c49b74343c2a85fdad9d","futureId":"Physical#PhysicalPrizeNFT","futureType":"NAMED_ARTIFACT_CONTRACT_DEPLOYMENT","libraries":{},"strategy":"basic","strategyConfig":{},"type":"DEPLOYMENT_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"Physical#PhysicalPrizeNFT","networkInteraction":{"data":"0x6080604052346200036d57620023c2803803806200001d8162000372565b92833981016040828203126200036d5781516001600160401b0392908381116200036d57826200004f91830162000398565b90602092838201518581116200036d576200006b920162000398565b92815181811162000357576000938454916001948584811c941680156200034c575b8385101462000338578190601f94858111620002e5575b5083908583116001146200028157889262000275575b5050600019600383901b1c191690851b1785555b8551928311620002615783548481811c9116801562000256575b828210146200024257828111620001fa575b508091831160011462000194575083948293949262000188575b5050600019600383901b1c191690821b1781555b60078054336001600160a01b031982168117909255604051936001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a362278d00600955600b55611fb790816200040b8239f35b01519050388062000114565b90601f198316958486528286209286905b888210620001e25750508385969710620001c8575b505050811b01815562000128565b015160001960f88460031b161c19169055388080620001ba565b808785968294968601518155019501930190620001a5565b8486528186208380860160051c82019284871062000238575b0160051c019085905b8281106200022c575050620000fa565b8781550185906200021c565b9250819262000213565b634e487b7160e01b86526022600452602486fd5b90607f1690620000e8565b634e487b7160e01b85526041600452602485fd5b015190503880620000ba565b8880528489208894509190601f1984168a5b87828210620002ce5750508411620002b4575b505050811b018555620000ce565b015160001960f88460031b161c19169055388080620002a6565b8385015186558b9790950194938401930162000293565b9091508780528388208580850160051c8201928686106200032e575b918991869594930160051c01915b8281106200031f575050620000a4565b8a81558594508991016200030f565b9250819262000301565b634e487b7160e01b87526022600452602487fd5b93607f16936200008d565b634e487b7160e01b600052604160045260246000fd5b600080fd5b6040519190601f01601f191682016001600160401b038111838210176200035757604052565b919080601f840112156200036d5782516001600160401b0381116200035757602090620003ce601f8201601f1916830162000372565b928184528282870101116200036d5760005b818110620003f657508260009394955001015290565b8581018301518482018401528201620003e056fe6080604081815260048036101561001557600080fd5b600092833560e01c90816301ffc9a7146117235750806306fdde0314611672578063081812fc14611652578063095ea7b3146114e557806315ed71f21461143d57806323b872dd1461141857806333c1420a146113ef578063379607f5146112e35780633a9a7b3014610eab57806342842e0e14610e775780636352211e14610e4657806370a0823114610db0578063715018a614610d53578063719130dd14610bb9578063726a41cf14610b6b578063755edd17146107075780638da5cb5b146106de57806394e68040146106bf57806395d89b41146105d1578063a1099bf21461055c578063a22cb4651461048d578063b88d4fde14610400578063c87b56dd146102f1578063e4cc770514610261578063e985e9c51461020f5763f2fde38b1461014157600080fd5b3461020b57602036600319011261020b5761015a6117e9565b90610163611ae9565b6001600160a01b039182169283156101b9575050600754826bffffffffffffffffffffffff60a01b821617600755167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a380f35b906020608492519162461bcd60e51b8352820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152fd5b8280fd5b50503461025d578060031936011261025d5760ff8160209361022f6117e9565b610237611804565b6001600160a01b0391821683526005875283832091168252855220549151911615158152f35b5080fd5b50903461020b57602036600319011261020b5781359161027f611ae9565b82156102b75750816020917f347ecdfa5418bcb04b269780ec51b3b9e3ad44e824e2cc0f12cabdc0db8be8fb9360095551908152a180f35b6020606492519162461bcd60e51b835282015260156024820152745072697a654e46543a207a65726f2077696e646f7760581b6044820152fd5b50903461020b57602091826003193601126103fc573560008181526002602052604090205461032a906001600160a01b03161515611a77565b8352600682528083209281518094829080546103458161190e565b91828552600191886001821691826000146103d5575050600114610397575b50505061039393929161037891038661189b565b815161038381611880565b52519282849384528301906117a9565b0390f35b8552868520879350859291905b8284106103bd5750505082010181610378610393610364565b8054848b0186015289955088949093019281016103a4565b60ff19168782015293151560051b8601909301935084925061037891506103939050610364565b8380fd5b83823461025d57608036600319011261025d5761041b6117e9565b90610424611804565b91604435606435936001600160401b03851161048957366023860112156104895761045e61048194866024610486983693013591016118d7565b9261047161046c8433611b41565b611986565b61047c838383611c09565b611eb5565b611d77565b80f35b8580fd5b50903461020b578060031936011261020b576104a76117e9565b9060243591821515809303610558576001600160a01b0316923384146105165750338452600560205280842083855260205280842060ff1981541660ff8416179055519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a380f35b6020606492519162461bcd60e51b8352820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152fd5b8480fd5b503461020b57602036600319011261020b57918192358152600a602052206103938251916105898361184f565b546001600160401b0380821680855282861c60ff161515602080870182905260489490941c909216948601859052945194855290840152604083019190915281906060820190565b8284346106bc57806003193601126106bc578151918282600193600154946105f88661190e565b9182855260209687600182169182600014610695575050600114610639575b505050610393929161062a91038561189b565b519282849384528301906117a9565b9190869350600183527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf65b82841061067d575050508201018161062a610393610617565b8054848a018601528895508794909301928101610664565b60ff19168782015293151560051b8601909301935084925061062a91506103939050610617565b80fd5b50503461025d578160031936011261025d576020906009549051908152f35b50503461025d578160031936011261025d5760075490516001600160a01b039091168152602090f35b50903461020b57602092836003193601126106bc576107246117e9565b9260018060a01b039161073c83600854163314611a34565b83519261074884611880565b8184528516928315610b34576009548015610afa57600b549660001990818914610ae7579061081b610481888b8b9560028f60019860018501600b5580519561079087611880565b8d87526000868152600260205260409020546107b8906001600160a01b031615155b15611f3e565b6000868152600260205260409020546107db906001600160a01b031615156107b2565b8d52600382528c2080546001019055838c52528c8a2080546001600160a01b0319168d179055818c8b600080516020611f8b8339815191528180a4611d9b565b835161091b575b50504201928342116109085750917f59c6d4f742b53fdff9e328fc653cdd5789189080ca04c587ad5e2bcc6b15d18f916108ff87946001600160401b03809416938a6108be8a51926108738461184f565b8784528284018781528c85018881528b8952600a9094528c882094518554915160ff60401b19919093161668ffffffffffffffffff199091161790151560401b60ff60401b16178355565b5167ffffffffffffffff60481b82549160481b169067ffffffffffffffff60481b1916179055875193849384528a84015260608884015260608301906117a9565b0390a351908152f35b634e487b7160e01b835260119052602482fd5b6000898152600260205260409020546001600160a01b031615610a8d5788855260068a52878520918451916001600160401b038311610a7a578b90610960855461190e565b601f8111610a41575b508192601f85116001146109d857505050908061099b9287916109cd575b508160011b916000199060031b1c19161790565b90555b7ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7888751898152a13880610822565b905085015138610987565b8589528d892093919250601f1985169089908f5b8a848410610a2b5750505050908460019594939210610a13575b505050811b01905561099e565b8701519060f88460031b161c19169055388080610a06565b85015187559581019593840193918201916109ec565b610a6a90868a52838a20601f870160051c810191858810610a70575b601f0160051c0190611d0d565b38610969565b9091508190610a5d565b634e487b7160e01b875260418852602487fd5b875162461bcd60e51b81528087018b9052602e60248201527f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60448201526d32bc34b9ba32b73a103a37b5b2b760911b6064820152608490fd5b634e487b7160e01b855260118652602485fd5b855162461bcd60e51b815280850189905260146024820152735072697a654e46543a206261642077696e646f7760601b6044820152606490fd5b845162461bcd60e51b815280840188905260116024820152705072697a654e46543a207a65726f20746f60781b6044820152606490fd5b503461020b57602036600319011261020b57358252600a6020908152918190205481516001600160401b0380831682529282901c60ff1615159381019390935260481c166040820152606090f35b50903461020b576020806003193601126103fc57823592610bd8611ae9565b838552600a82526001600160401b0383862054610bfa60ff82871c16156119e8565b16421115610d1a578492918484600a93610c1383611ac3565b50610c1d83611ac3565b83835290845285822080546001600160a01b03199081169091556001600160a01b03909116808352600385528683208054600019019055838352600285528683208054909216909155600080516020611f8b8339815191528280a460068152610c888385205461190e565b610cbb575b848452528120557fe5e31c711eccb0a0fec1d483872536e3505e22d192c888d835301bb8d73097448280a280f35b8484526006815283838120610cd0815461190e565b80610cde575b505050610c8d565b82601f8211600114610cf6575050555b833880610cd6565b9091808252610d13601f868420940160051c840160018501611d0d565b5555610cee565b915162461bcd60e51b8152918201526015602482015274141c9a5e995391950e881b9bdd08195e1c1a5c9959605a1b6044820152606490fd5b83346106bc57806003193601126106bc57610d6c611ae9565b600780546001600160a01b0319811690915581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b5082903461025d57602036600319011261025d576001600160a01b03610dd46117e9565b16908115610df15760208480858581526003845220549051908152f35b608490602085519162461bcd60e51b8352820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152fd5b5091346106bc5760203660031901126106bc5750610e6660209235611ac3565b90516001600160a01b039091168152f35b50503461025d5761048161048691610e8e3661181a565b91925192610e9b84611880565b86845261047161046c8433611b41565b50903461020b57608036600319011261020b57610ec66117e9565b9260249283356001600160401b03918282168092036103fc576044359360643584811161025d573660238201121561025d57610f0a903690898186013591016118d7565b9160018060a01b03610f2181600854163314611a34565b89169586156112ad57806112a75750600954975b881561126e57600b5498600019808b1461125c5760018b01600b5589519b610f5c8d611880565b858d5260008c815260026020526040902054610f81906001600160a01b031615611f3e565b60008c815260026020526040902054610fa3906001600160a01b031615611f3e565b898652600360209081528b8720805460010190558c8752600281528b872080546001600160a01b0319168c1790559c8c808c89600080516020611f8b8339815191528180a4610ff192611d9b565b610ffa90611d77565b85516110a7575b5042019182421161109657505084927f59c6d4f742b53fdff9e328fc653cdd5789189080ca04c587ad5e2bcc6b15d18f9492896108be8c82996108ff9616978c80519561104d8761184f565b8a8752600a84880194828652838901978c8952835252209451166001600160401b0319855416178455511515839060ff60401b825491151560401b169060ff60401b1916179055565b634e487b7160e01b84526011905282fd5b60008b8152600260205260409020546001600160a01b031615611203578a855260068c52898520908651908982116111f1578d6110e4845461190e565b90601f82116111c3575b50508d8091601f841160011461115c575050908061112092889161115157508160011b916000199060031b1c19161790565b90555b7ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce78b8a518c8152a138611001565b905088015138610987565b9091601f198416858a52838a20938a905b8c8383106111ab57505050908460019594939210611193575b505050811b019055611123565b8a01519060f88460031b161c19169055388080611186565b6001859783949684930151815501960193019061116d565b8489528089206111ea92601f860160051c8201928610610a7057601f0160051c0190611d0d565b388e6110ee565b634e487b7160e01b8752604186528487fd5b895162461bcd60e51b81528085018d9052602e818501527f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60448201526d32bc34b9ba32b73a103a37b5b2b760911b6064820152608490fd5b634e487b7160e01b8552601184528285fd5b90601460649260208a519362461bcd60e51b8552840152820152735072697a654e46543a206261642077696e646f7760601b6044820152fd5b97610f35565b875162461bcd60e51b81526020818401526011818b0152705072697a654e46543a207a65726f20746f60781b6044820152606490fd5b503461020b57602036600319011261020b5780359161130183611ac3565b336001600160a01b03909116036113b657828452600a6020528084209182549161133060ff84831c16156119e8565b6001600160401b038316421161137f57505060ff60401b19166801000000000000000017905533907fbfb36529287d5a1dcbfbbc958f0a7337a1f5bca269edc737da0be1be702f22518380a380f35b906020606492519162461bcd60e51b83528201526011602482015270141c9a5e995391950e88195e1c1a5c9959607a1b6044820152fd5b906020606492519162461bcd60e51b83528201526013602482015272283934bd32a7232a1d103737ba1037bbb732b960691b6044820152fd5b50503461025d578160031936011261025d5760085490516001600160a01b039091168152602090f35b83346106bc5761048661142a3661181a565b9161143861046c8433611b41565b611c09565b503461020b57602036600319011261020b576114576117e9565b61145f611ae9565b6001600160a01b03169182156114aa575050600880546001600160a01b031916821790557f1b9ca247680a449da537757f5925ac6b546f3ac5872470f9d8dc14500696ceff8280a280f35b906020606492519162461bcd60e51b835282015260156024820152745072697a654e46543a207a65726f20726166666c6560581b6044820152fd5b503461020b578160031936011261020b576114fe6117e9565b6024359290916001600160a01b039190828061151987611ac3565b16941693808514611605578033149081156115e6575b501561157e57848652602052842080546001600160a01b0319168317905561155683611ac3565b167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258480a480f35b6020608492519162461bcd60e51b8352820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152fd5b90508652600560205281862033875260205260ff82872054163861152f565b506020608492519162461bcd60e51b8352820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152fd5b5091346106bc5760203660031901126106bc5750610e6660209235611948565b8284346106bc57806003193601126106bc57815191828283546116948161190e565b90818452602095600191876001821691826000146106955750506001146116c857505050610393929161062a91038561189b565b91908693508280527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5635b82841061170b575050508201018161062a610393610617565b8054848a0186015288955087949093019281016116f2565b9250503461020b57602036600319011261020b573563ffffffff60e01b811680910361020b5760209250632483248360e11b8114908115611766575b5015158152f35b6380ac58cd60e01b811491508115611798575b8115611787575b503861175f565b6301ffc9a760e01b14905038611780565b635b5e139f60e01b81149150611779565b919082519283825260005b8481106117d5575050826000602080949584010152601f8019910116010190565b6020818301810151848301820152016117b4565b600435906001600160a01b03821682036117ff57565b600080fd5b602435906001600160a01b03821682036117ff57565b60609060031901126117ff576001600160a01b039060043582811681036117ff579160243590811681036117ff579060443590565b606081019081106001600160401b0382111761186a57604052565b634e487b7160e01b600052604160045260246000fd5b602081019081106001600160401b0382111761186a57604052565b90601f801991011681019081106001600160401b0382111761186a57604052565b6001600160401b03811161186a57601f01601f191660200190565b9291926118e3826118bc565b916118f1604051938461189b565b8294818452818301116117ff578281602093846000960137010152565b90600182811c9216801561193e575b602083101461192857565b634e487b7160e01b600052602260045260246000fd5b91607f169161191d565b60008181526002602052604090205461196b906001600160a01b03161515611a77565b6000908152600460205260409020546001600160a01b031690565b1561198d57565b60405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201526c1c881bdc88185c1c1c9bdd9959609a1b6064820152608490fd5b156119ef57565b60405162461bcd60e51b815260206004820152601960248201527f5072697a654e46543a20616c726561647920636c61696d6564000000000000006044820152606490fd5b15611a3b57565b60405162461bcd60e51b81526020600482015260146024820152735072697a654e46543a206e6f7420726166666c6560601b6044820152606490fd5b15611a7e57565b60405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152606490fd5b6000908152600260205260409020546001600160a01b0316611ae6811515611a77565b90565b6007546001600160a01b03163303611afd57565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b906001600160a01b038080611b5584611ac3565b16931691838314938415611b88575b508315611b72575b50505090565b611b7e91929350611948565b1614388080611b6c565b909350600052600560205260406000208260005260205260ff604060002054169238611b64565b15611bb657565b60405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608490fd5b90611c3191611c1784611ac3565b6001600160a01b0393918416928492909183168414611baf565b16918215611cbc5781611c4e91611c4786611ac3565b1614611baf565b600080516020611f8b83398151915260008481526004602052604081206bffffffffffffffffffffffff60a01b9081815416905583825260036020526040822060001981540190558482526040822060018154019055858252600260205284604083209182541617905580a4565b60405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608490fd5b818110611d18575050565b60008155600101611d0d565b60809060208152603260208201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b60608201520190565b15611d7e57565b60405162461bcd60e51b815280611d9760048201611d24565b0390fd5b91929091803b15611eac57611de8936040519081630a85bd0160e11b9384825233600483015260009687602484015260448301526080606483015281878160209a8b9660848301906117a9565b03926001600160a01b03165af1849181611e6c575b50611e5b575050503d600014611e53573d611e17816118bc565b90611e25604051928361189b565b81528091833d92013e5b80519182611e505760405162461bcd60e51b815280611d9760048201611d24565b01fd5b506060611e2f565b6001600160e01b0319161492509050565b9091508581813d8311611ea5575b611e84818361189b565b8101031261055857516001600160e01b031981168103610558579038611dfd565b503d611e7a565b50915050600190565b9293919290803b15611f3457611f099460018060a01b039460405192839187630a85bd0160e11b9687855233600486015216602484015260448301526080606483015281806020998a9560848301906117a9565b03916000988991165af1849181611e6c5750611e5b575050503d600014611e53573d611e17816118bc565b5050915050600190565b15611f4557565b60405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606490fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa164736f6c6343000818000a00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000b416b696261205072697a650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005414b494241000000000000000000000000000000000000000000000000000000","id":1,"type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"Physical#PhysicalPrizeNFT","networkInteractionId":1,"nonce":0,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"Physical#PhysicalPrizeNFT","networkInteractionId":1,"nonce":0,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"50001000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"1000000"}},"hash":"0xce46b4bcff308509e1170b1d70e2264b6ba012f4642b211b555802f610b7521b"},"type":"TRANSACTION_SEND"} +{"futureId":"Physical#PhysicalPrizeNFT","hash":"0xce46b4bcff308509e1170b1d70e2264b6ba012f4642b211b555802f610b7521b","networkInteractionId":1,"receipt":{"blockHash":"0x9b6323d78b345324245521417f2be20b001b5f34db6087074c3e05d9a76a1687","blockNumber":55936757,"contractAddress":"0x8F60907f41593d4B41f5e0cEa48415cd61854a79","logs":[{"address":"0x8F60907f41593d4B41f5e0cEa48415cd61854a79","data":"0x","logIndex":0,"topics":["0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0","0x0000000000000000000000000000000000000000000000000000000000000000","0x00000000000000000000000003909bb1e9799336d4a8c49b74343c2a85fdad9d"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"Physical#PhysicalPrizeNFT","result":{"address":"0x8F60907f41593d4B41f5e0cEa48415cd61854a79","type":"SUCCESS"},"type":"DEPLOYMENT_EXECUTION_STATE_COMPLETE"} +{"artifactId":"points#AkibaMiles","constructorArgs":[],"contractName":"AkibaMiles","dependencies":[],"from":"0x03909bb1e9799336d4a8c49b74343c2a85fdad9d","futureId":"points#AkibaMiles","futureType":"NAMED_ARTIFACT_CONTRACT_DEPLOYMENT","libraries":{},"strategy":"basic","strategyConfig":{},"type":"DEPLOYMENT_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"points#AkibaMiles","networkInteraction":{"data":"0x60803462000355576001600160401b03906040908082018381118282101762000256578252600a815260209069416b6962614d696c657360b01b828201528251938385018581108282111762000256578452600594858152644d696c657360d81b84820152825182811162000256576003918254916001958684811c941680156200034a575b8885101462000334578190601f94858111620002df575b50889085831160011462000278576000926200026c575b505060001982861b1c191690861b1783555b8051938411620002565760049586548681811c911680156200024b575b828210146200023657838111620001ed575b50809285116001146200017f575093839491849260009562000173575b50501b92600019911b1c19161790555b8154336001600160a01b031982168117909355905191906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3610e1e90816200035b8239f35b01519350388062000111565b92919084601f1981168860005285600020956000905b89838310620001d25750505010620001b7575b50505050811b01905562000121565b01519060f884600019921b161c1916905538808080620001a8565b85870151895590970196948501948893509081019062000195565b8760005281600020848088018c1c8201928489106200022c575b018b1c019087905b8281106200021f575050620000f4565b600081550187906200020f565b9250819262000207565b602288634e487b7160e01b6000525260246000fd5b90607f1690620000e2565b634e487b7160e01b600052604160045260246000fd5b015190503880620000b3565b90889350601f19831691876000528a6000209260005b8c828210620002c85750508411620002af575b505050811b018355620000c5565b015160001983881b60f8161c19169055388080620002a1565b8385015186558c979095019493840193016200028e565b9091508560005288600020858085018d1c8201928b86106200032a575b918d8b928796959401901c01915b8281106200031a5750506200009c565b600081558594508a91016200030a565b92508192620002fc565b634e487b7160e01b600052602260045260246000fd5b93607f169362000085565b600080fdfe608060408181526004918236101561001657600080fd5b600092833560e01c91826306fdde031461097457508163095ea7b31461094a57816318160ddd1461092b57816323b872dd14610861578163313ce5671461084557816339509351146107f557816340c10f19146106fe57816370a08231146106c7578163715018a61461066a5781638da5cb5b1461064157816395d89b41146105205781639dc29fac146103ac578163a457c2d714610304578163a9059cbb146102d3578163cf456ae714610244578163dd62ed3e146101fb578163f2fde38b1461012b575063f46eccc4146100eb57600080fd5b346101275760203660031901126101275760209160ff9082906001600160a01b03610114610a97565b1681526006855220541690519015158152f35b5080fd5b9050346101f75760203660031901126101f757610146610a97565b9061014f610db9565b6001600160a01b039182169283156101a5575050600554826bffffffffffffffffffffffff60a01b821617600555167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a380f35b906020608492519162461bcd60e51b8352820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152fd5b8280fd5b50503461012757806003193601126101275780602092610219610a97565b610221610ab2565b6001600160a01b0391821683526001865283832091168252845220549051908152f35b919050346101f757806003193601126101f75761025f610a97565b91602435928315158094036102cf57610276610db9565b6001600160a01b03169081156102a057508352600660205282209060ff8019835416911617905580f35b606490602084519162461bcd60e51b835282015260096024820152682d32b9379030b2323960b91b6044820152fd5b8480fd5b5050346101275780600319360112610127576020906102fd6102f3610a97565b6024359033610bed565b5160018152f35b905082346103a957826003193601126103a95761031f610a97565b918360243592338152600160205281812060018060a01b0386168252602052205490828210610358576020856102fd8585038733610aeb565b608490602086519162461bcd60e51b8352820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152fd5b80fd5b839150346101275782600319360112610127576103c7610a97565b6001600160a01b0316906024359082158015906104d357806104cc575b61048d5782845283602052848420549082821061043f57508184957fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef936020938688528785520381872055816002540360025551908152a380f35b608490602087519162461bcd60e51b8352820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152fd5b606490602086519162461bcd60e51b83528201526019602482015278151c985b9cd9995c9cc8185c99481b9bdd08185b1b1bddd959603a1b6044820152fd5b50836103e4565b855162461bcd60e51b8152602081840152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608490fd5b83833461012757816003193601126101275780519082845460018160011c9060018316928315610637575b60209384841081146106245783885290811561060857506001146105b3575b505050829003601f01601f191682019267ffffffffffffffff8411838510176105a0575082918261059c925282610a4e565b0390f35b634e487b7160e01b815260418552602490fd5b8787529192508591837f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b5b8385106105f4575050505083010185808061056a565b8054888601830152930192849082016105de565b60ff1916878501525050151560051b840101905085808061056a565b634e487b7160e01b895260228a52602489fd5b91607f169161054b565b50503461012757816003193601126101275760055490516001600160a01b039091168152602090f35b83346103a957806003193601126103a957610683610db9565b600580546001600160a01b0319811690915581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b5050346101275760203660031901126101275760209181906001600160a01b036106ef610a97565b16815280845220549051908152f35b919050346101f757806003193601126101f757610719610a97565b60055460243592916001600160a01b03918216331415806107df575b6107d0571692831561078e57506020827fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef926107748795600254610ac8565b60025585855284835280852082815401905551908152a380f35b6020606492519162461bcd60e51b8352820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152fd5b82516282b42960e81b81528590fd5b50338652600660205260ff838720541615610735565b5050346101275780600319360112610127576102fd60209261083e610818610a97565b338352600186528483206001600160a01b03821684528652918490205460243590610ac8565b9033610aeb565b5050346101275781600319360112610127576020905160128152f35b839150346101275760603660031901126101275761087d610a97565b610885610ab2565b91846044359460018060a01b0384168152600160205281812033825260205220549060001982036108bf575b6020866102fd878787610bed565b8482106108e857509183916108dd602096956102fd95033383610aeb565b9193948193506108b1565b606490602087519162461bcd60e51b8352820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152fd5b5050346101275781600319360112610127576020906002549051908152f35b5050346101275780600319360112610127576020906102fd61096a610a97565b6024359033610aeb565b849084346101f757826003193601126101f7578260035460018160011c9060018316928315610a44575b60209384841081146106245783885290811561060857506001146109ee57505050829003601f01601f191682019267ffffffffffffffff8411838510176105a0575082918261059c925282610a4e565b600387529192508591837fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5b838510610a30575050505083010185808061056a565b805488860183015293019284908201610a1a565b91607f169161099e565b6020808252825181830181905290939260005b828110610a8357505060409293506000838284010152601f8019910116010190565b818101860151848201604001528501610a61565b600435906001600160a01b0382168203610aad57565b600080fd5b602435906001600160a01b0382168203610aad57565b91908201809211610ad557565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b03908116918215610b9c5716918215610b4c5760207f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925918360005260018252604060002085600052825280604060002055604051908152a3565b60405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608490fd5b6001600160a01b039081168015801594919391929190610d66571692831580610d155781610d0c575b50610ccb57600082815280602052604081205491808310610c7757604082827fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef958760209652828652038282205586815220818154019055604051908152a3565b60405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608490fd5b60405162461bcd60e51b8152602060048201526019602482015278151c985b9cd9995c9cc8185c99481b9bdd08185b1b1bddd959603a1b6044820152606490fd5b90501538610c16565b60405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608490fd5b60405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608490fd5b6005546001600160a01b03163303610dcd57565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fdfea164736f6c6343000818000a","id":1,"type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"points#AkibaMiles","networkInteractionId":1,"nonce":1,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"points#AkibaMiles","networkInteractionId":1,"nonce":1,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"50001000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"1000000"}},"hash":"0x88fdfed0933d3e98243bc3257d628db1001b21796fc2cee0bde265fb56aea4a6"},"type":"TRANSACTION_SEND"} +{"futureId":"points#AkibaMiles","hash":"0x88fdfed0933d3e98243bc3257d628db1001b21796fc2cee0bde265fb56aea4a6","networkInteractionId":1,"receipt":{"blockHash":"0xd8ce1390fa4695923d0fb3be861f95b9c8a34e4247ee701c18a061fbbf65e096","blockNumber":55937051,"contractAddress":"0xd59AE111d976342ff58c6dE2B6f2b002415825C1","logs":[{"address":"0xd59AE111d976342ff58c6dE2B6f2b002415825C1","data":"0x","logIndex":1,"topics":["0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0","0x0000000000000000000000000000000000000000000000000000000000000000","0x00000000000000000000000003909bb1e9799336d4a8c49b74343c2a85fdad9d"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"points#AkibaMiles","result":{"address":"0xd59AE111d976342ff58c6dE2B6f2b002415825C1","type":"SUCCESS"},"type":"DEPLOYMENT_EXECUTION_STATE_COMPLETE"} +{"artifactId":"MilesV3#akiba_impl","constructorArgs":[],"contractName":"AkibaRaffleV3","dependencies":[],"from":"0x03909bb1e9799336d4a8c49b74343c2a85fdad9d","futureId":"MilesV3#akiba_impl","futureType":"NAMED_ARTIFACT_CONTRACT_DEPLOYMENT","libraries":{},"strategy":"basic","strategyConfig":{},"type":"DEPLOYMENT_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"MilesV3#akiba_impl","networkInteraction":{"data":"0x60a08060405234610031573060805261311590816100378239608051818181611c9501528181611d9501526120070152f35b600080fdfe608080604052600436101561001357600080fd5b60003560e01c90816309c79735146127e8575080631fccf672146127bf578063234d00011461259657806324214191146125785780632f48ab7d1461254f5780633423ce821461226e5780633659cfe614611fe35780634f1ef28614611d4657806352d1902d14611c825780635ee49b8f14611b3157806360b2a56a14610eb657806371533fe514610e8d5780637509f58614610e18578063866b1be314610dc75780638da5cb5b14610d9e578063958d9c461461083b578063cf456ae7146107a3578063d9caed12146105d2578063df5cf2b11461052c578063e200c8571461049f578063e6c81c7214610476578063e84daf0a1461044d578063f2fde38b146103a3578063f46eccc414610364578063f7149220146103355763f8c8765e1461013d57600080fd5b346103305760803660031901126103305761015661284a565b61015e612834565b6001600160a01b039060443582811691908290036103305760643591838316809303610330576000549360ff8560081c161594858096610323575b801561030c575b156102b05760ff1981166001176000558561029e575b5080600054966101dd60ff8960081c166101cf81612d4d565b6101d881612d4d565b612d4d565b600160655516928315610264576bffffffffffffffffffffffff60a01b938085609954161760995584609c541617609c551682609a541617609a5581609b541617609b55609754161760975561022f57005b61ff0019166000557f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498602060405160018152a1005b60405162461bcd60e51b8152602060048201526012602482015271696e76616c6964204d696e69506f696e747360701b6044820152606490fd5b61ffff191661010117600055386101b6565b60405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608490fd5b50303b1580156101a05750600160ff8216146101a0565b50600160ff821610610199565b600080fd5b3461033057600036600319011261033057602060405173c0ffee98ad1434acbdb894bbb752e138c1006fab8152f35b34610330576020366003190112610330576001600160a01b0361038561284a565b1660005260a0602052602060ff604060002054166040519015158152f35b34610330576020366003190112610330576103bc61284a565b6097546001600160a01b03808216926103d6338514612b78565b169182156104155782907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a36001600160a01b03191617609755005b60405162461bcd60e51b815260206004820152601060248201526f27bbb732b91d103d32b9379030b2323960811b6044820152606490fd5b34610330576000366003190112610330576099546040516001600160a01b039091168152602090f35b34610330576000366003190112610330576098546040516001600160a01b039091168152602090f35b346103305760208060031936011261033057600435600052609e8152600660406000200190604051808383829554938481520190600052836000209260005b8582821061050d575050506104f59250038361288e565b610509604051928284938452830190612901565b0390f35b85546001600160a01b03168452600195860195889550930192016104de565b346103305760203660031901126103305761012060043580600052609e60205260ff604060002060078101549061056483831661298a565b600181015490600281015460038201549063ffffffff80600985015416916005600486015495015495604051998a5260208a0152604089015282166060880152608087015260018060a01b039060201c1660a086015260c085015260e084015260081c161515610100820152f35b34610330576060366003190112610330576105eb61284a565b6105f3612834565b6044359060018060a01b0361060d81609754163314612b78565b80821693841561076857831561072b571691604051916370a0823160e01b83523060048401526020928381602481885afa90811561071f576000916106f2575b5084600052609f845260406000205480821191826106de575b5050156106a4579061069b817f9b1bfa7fa9ee420a16e124f794c35ac9f90472acc99140eb2f6447c714cad8eb949386612d0a565b604051908152a3005b60405162461bcd60e51b815260048101849052601260248201527115da5d1a191c985dce881c995cd95c9d995960721b6044820152606490fd5b6106e89250612b53565b8211158680610666565b90508381813d8311610718575b610709818361288e565b8101031261033057518661064d565b503d6106ff565b6040513d6000823e3d90fd5b60405162461bcd60e51b815260206004820152601560248201527415da5d1a191c985dce881e995c9bc8185b5bdd5b9d605a1b6044820152606490fd5b60405162461bcd60e51b81526020600482015260136024820152722bb4ba34323930bb9d103d32b9379030b2323960691b6044820152606490fd5b34610330576040366003190112610330576107bc61284a565b60243590811515809203610330576097546001600160a01b0391906107e49083163314612b78565b16801561080a5760005260a060205260406000209060ff80198354169116179055600080f35b60405162461bcd60e51b81526020600482015260096024820152682d32b9379030b2323960b91b6044820152606490fd5b34610330576101003660031901126103305760443563ffffffff81168103610330576064356001600160a01b03811690036103305760843560ff811681036103305760e4356001600160401b0381116103305736602382011215610330576108ad9036906024816004013591016128ca565b9060018060a01b036097541633141580610d85575b610d7457602435151580610d65575b15610d2b574260043510610cee576064356001600160a01b031615610cb457600360ff821611610c6f57600360ff8216141580610c65575b610c0857609c546001600160a01b0390811660643590911603610b89575b610932609d54612bc5565b9283609d5583600052609e6020526040600020938455600435600185015561095e602435600435612bb8565b6002850155600384015463ffffffff640100000000600160c01b0360643560201b169216906001600160401b0360c01b161717600384015560a435600484015560c435600584015560ff60078401918119926001848254161790551690600c8401541617600c8301558051906001600160401b038211610b735781906109e7600d850154612bd4565b601f8111610b20575b50602090601f8311600114610aae57600092610aa3575b50508160011b916000199060031b1c191617600d8201555b7f452eb14dda7e8bf2507d69049b0adbe025e32286bd6398252780fc0edaefbf1a60e082549260018101549060028101549063ffffffff600482015460038301549060ff600c600586015495015416946040519687526020870152604086015260018060a01b038160201c16606086015216608084015260a083015260c0820152a2005b015190508380610a07565b9250600d84016000526020600020906000935b601f1984168510610b05576001945083601f19811610610aec575b505050811b01600d820155610a1f565b015160001960f88460031b161c19169055838080610adc565b81810151835560209485019460019093019290910190610ac1565b909150600d84016000526020600020601f840160051c810160208510610b6c575b90849392915b601f830160051c82018110610b5d5750506109f0565b60008155859450600101610b47565b5080610b41565b634e487b7160e01b600052604160045260246000fd5b6040516323b872dd60e01b602082015233602482015230604482015260a4356064820152606481528060a08101106001600160401b0360a083011117610b73578060a0610bdc9201604052606435612ef3565b60018060a01b0360643516600052609f6020526040600020610c0160a4358254612bb8565b9055610927565b60405162461bcd60e51b815260206004820152602f60248201527f526166666c653a2030205265776172647320666f72204469676974616c20436160448201526e73682f4d696c657320526166666c6560881b6064820152608490fd5b5060a43515610909565b60405162461bcd60e51b815260206004820152601860248201527f526166666c653a207479706520756e737570706f7274656400000000000000006044820152606490fd5b60405162461bcd60e51b81526020600482015260126024820152712930b33336329d103d32b937903a37b5b2b760711b6044820152606490fd5b60405162461bcd60e51b8152602060048201526015602482015274149859999b194e881cdd185c9d081a5b881c185cdd605a1b6044820152606490fd5b60405162461bcd60e51b8152602060048201526012602482015271526166666c653a2062616420706172616d7360701b6044820152606490fd5b5063ffffffff831615156108d1565b6040516282b42960e81b8152600490fd5b503360005260a060205260ff60406000205416156108c2565b34610330576000366003190112610330576097546040516001600160a01b039091168152602090f35b3461033057602036600319011261033057610de061284a565b6097546001600160a01b039190610dfa9083163314612b78565b166bffffffffffffffffffffffff60a01b6098541617609855600080f35b346103305760208060031936011261033057600435600052609e8152600b60406000200190604051808383829554938481520190600052836000209260005b85828210610e6e575050506104f59250038361288e565b85546001600160a01b0316845260019586019588955093019201610e57565b3461033057600036600319011261033057609c546040516001600160a01b039091168152602090f35b3461033057602036600319011261033057610ecf612c0e565b600435600052609e602052610eea604060002054151561293e565b600435600052609e602052604060002060ff6007820154610f0c8282166129f4565b60081c16611af457600281015442118015611ada575b15611aa057600381015463ffffffff8116601481029080820460141490151715611324576064900463ffffffff60098401541610611a5b57600a82015480151590816119e4575b501561199f57609c546001600160a01b0360209290921c821691168103611979575b50600c8101805460ff168061117657505063ffffffff600982015416600a820154604051916324cbbfc160e01b8352600483015260006024830152604482015260208160648173c0ffee98ad1434acbdb894bbb752e138c1006fab5afa90811561071f576110099163ffffffff91600091611147575b501682612e3d565b9061101782600b8301612a51565b60078101805461ffff19166101001790556003810154609c5460209190911c6001600160a01b039081169116810361110c57506099546004820154906001600160a01b0316803b15610330576040516340c10f1960e01b81526001600160a01b038516600482015260248101929092526000908290604490829084905af1801561071f577ffee5b04775e1cd2311ed22cd00f5d2403aff38ff6f71d6d393f51854ed6bc986926110f2926004926110fd575b505b0154604080516001600160a01b039095168552602085019190915260043593918291820190565b0390a25b6001606555005b61110690612860565b856110c9565b6004826111426110f29386847ffee5b04775e1cd2311ed22cd00f5d2403aff38ff6f71d6d393f51854ed6bc98697015491612d0a565b6110cb565b611169915060203d60201161116f575b611161818361288e565b810190612c64565b84611001565b503d611157565b6001811490811561196e575b501561177e575460ff16600181036116a85750604051608081018181106001600160401b03821117610b735760405260038152606036602083013760146111e08260326111ce82612c97565b52601e6111da82612ca4565b52612cb4565b525b6111ec8151612cd8565b6000805b8351808310908161168b575b501561133a5763ffffffff60098601541660018201821161132457600a860154604051916324cbbfc160e01b83526004830152600183016024830152604482015260208160648173c0ffee98ad1434acbdb894bbb752e138c1006fab5afa90811561071f5761127b9163ffffffff91600091611305575b501686612e3d565b6000805b8481106112d6575b501561129d575b5061129890612bc5565b6111f0565b9091611298916112cf91906112ca906001600160a01b0381166112c08489612cc4565b52600b8901612a51565b612bc5565b919061128e565b6001600160a01b03838116906112ec8389612cc4565b5116146112fb5760010161127f565b5050600187611287565b61131e915060203d60201161116f57611161818361288e565b88611273565b634e487b7160e01b600052601160045260246000fd5b5090928115611646576000805b838110611620575061135883612c80565b93611366604051958661288e565b83855261137284612c80565b601f19013660208701376000906001850361156957505050600481015461139884612c97565b525b60078101805461ffff19166101001790556003810154609c546001600160a01b0390811660209290921c1603611519575060005b81811061149457505b6113e081612cd8565b9060005b81811061146c57505090915061140560405191604083526040830190612901565b81810360208301526020808451928381520193019060005b81811061145657505050807f6f2086a232e2eb114d9bb965c9edf2040c10252db76bd117307631c4bfc82b4091600435930390a26110f6565b825185526020948501949092019160010161141d565b6001906001600160a01b036114818288612cc4565b511661148d8286612cc4565b52016113e4565b6099546001600160a01b0390811691906114ae8287612cc4565b51166114ba8286612cc4565b51833b15610330576040516340c10f1960e01b81526001600160a01b039290921660048301526024820152916000908390604490829084905af191821561071f5760019261150a575b50016113ce565b61151390612860565b85611503565b60005b82811061152a5750506113d7565b6003820154600191906115639060201c6001600160a01b0390811690611550848a612cc4565b511661155c8489612cc4565b5191612d0a565b0161151c565b9091939294956000936004870154935b6000198201828111611324578610156115f35761ffff6115a58161159d8988612cc4565b5116876129c9565b91818916156115dd576001926115d5928a1690046115c3898d612cc4565b526115ce888c612cc4565b5190612bb8565b950194611579565b634e487b7160e01b600052601260045260246000fd5b925094509594925061160491612b53565b60001983018381116113245761161a9085612cc4565b5261139a565b9061ffff9081806116318589612cc4565b51169116019081116113245790600101611347565b60405162461bcd60e51b815260206004820152601960248201527f526166666c653a206e6f20756e697175652077696e6e657273000000000000006044820152606490fd5b80915060041b9080820460101490151715611324578110866111fc565b6002036117395760405160c081018181106001600160401b03821117610b73576040526005815260a03660208301378060326116e382612c97565b5260196116ef82612ca4565b52600f6116fb82612cb4565b5280516003101561172357600a60808201528051600410156117235760a0600a9101526111e2565b634e487b7160e01b600052603260045260246000fd5b60405162461bcd60e51b815260206004820152601a60248201527f526166666c653a20696e76616c696420726166666c65547970650000000000006044820152606490fd5b5063ffffffff600982015416600a820154604051916324cbbfc160e01b8352600483015260006024830152604482015260208160648173c0ffee98ad1434acbdb894bbb752e138c1006fab5afa90811561071f576117eb9163ffffffff9160009161114757501682612e3d565b6117f881600b8401612a51565b60078201805461ffff19166101001790556098546040516303a9a7b360e41b81526001600160a01b039283166004808301829052356001600160401b0316602483015260006044830181905260806064840152600d909501805491959294939093169284929161186781612bd4565b9182608486015260a4916001811690816000146119455750600114611907575b505050918160008160209503925af1801561071f576118dc575b50604051908152600160208201527ffee5b04775e1cd2311ed22cd00f5d2403aff38ff6f71d6d393f51854ed6bc986604060043592a26110f6565b602090813d8311611900575b6118f2818361288e565b8101031261033057816118a1565b503d6118e8565b6000908152602081209093505b82841061192c57505050810160a40181600081611887565b8054848801830152869450602090930192600101611914565b60ff191660a48088019190915293151560051b8601909301935084925060009150829050611887565b600291501483611182565b600482015490600052609f6020526119976040600020918254612b53565b905581610f8b565b60405162461bcd60e51b815260206004820152601a60248201527f526166666c653a2072616e646f6d6e6573732070656e64696e670000000000006044820152606490fd5b9050604051906326f21bfb60e21b8252600482015260208160248173c0ffee98ad1434acbdb894bbb752e138c1006fab5afa90811561071f57600091611a2c575b5083610f69565b611a4e915060203d602011611a54575b611a46818361288e565b810190612b60565b83611a25565b503d611a3c565b60405162461bcd60e51b815260206004820152601960248201527f526166666c653a207468726573686f6c64206e6f74206d6574000000000000006044820152606490fd5b60405162461bcd60e51b8152602060048201526012602482015271149859999b194e881d5b999a5b9a5cda195960721b6044820152606490fd5b5063ffffffff806009830154169060038301541614610f22565b60405162461bcd60e51b81526020600482015260156024820152742930b33336329d1030b63932b0b23c90323930bbb760591b6044820152606490fd5b602080600319360112610330576004359081600052609e8152611b5a604060002054151561293e565b81600052609e8152600a604060002001908154611c3e576040516334cd994560e11b815281816004813473c0ffee98ad1434acbdb894bbb752e138c1006fab5af190811561071f57600091611c11575b50438355348110611be3575b507f3d94fecedaa4f90b8bd459797adb95f5bb11426025c5541390d9ccc1ad1b60a19154604051908152a2005b60008080611bf2819434612b53565b818115611c08575b3390f11561071f5783611bb6565b506108fc611bfa565b90508181813d8311611c37575b611c28818361288e565b81010312610330575184611baa565b503d611c1e565b6064906040519062461bcd60e51b82526004820152601c60248201527f526166666c653a2072616e646f6d6e65737320726571756573746564000000006044820152fd5b34610330576000366003190112610330577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163003611cdb5760206040516000805160206130e98339815191528152f35b60405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608490fd5b604036600319011261033057611d5a61284a565b6024356001600160401b038111610330573660238201121561033057611d8a9036906024816004013591016128ca565b906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811690611dc330831415612a91565b611de06000805160206130e9833981519152928284541614612af2565b611def81609754163314612b78565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615611e27575050611e259150612dad565b005b6040516352d1902d60e01b81526020939291831691908481600481865afa60009181611fb4575b50611eaf5760405162461bcd60e51b815260048101869052602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608490fd5b03611f5d57611ebd82612dad565b7fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2825115801590611f55575b611ef357005b600080611e259460405194611f0786612873565b602786527f416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c81870152660819985a5b195960ca1b604087015281519101845af4611f4f612fe4565b91613014565b506001611eed565b60405162461bcd60e51b815260048101849052602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608490fd5b9091508581813d8311611fdc575b611fcc818361288e565b8101031261033057519087611e4e565b503d611fc2565b346103305760208060031936011261033057611ffd61284a565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116929061203630851415612a91565b6120536000805160206130e9833981519152948286541614612af2565b61206281609754163314612b78565b60405193828501918583106001600160401b03841117610b7357826040526000865260ff7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd914354166000146120be5750505050611e259150612dad565b84939416906040516352d1902d60e01b81528581600481865afa6000918161223f575b506121425760405162461bcd60e51b815260048101879052602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608490fd5b036121e85761215083612dad565b7fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a28351158015906121e0575b61218657005b60008091611e25957f416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c604051966121bc88612873565b60278852870152660819985a5b195960ca1b60408701525190845af4611f4f612fe4565b506000612180565b60405162461bcd60e51b815260048101859052602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608490fd5b9091508681813d8311612267575b612257818361288e565b81010312610330575190886120e1565b503d61224d565b34610330576040366003190112610330576004356024359063ffffffff91828116928382036103305782600052602090609e82526122b2604060002054151561293e565b6122ba612c0e565b83600052609e82526040600020926122d860ff6007860154166129f4565b600184015442101580612541575b156124fc5760098401916122fd8282855416612a39565b81806003880154169116116124b75761231a8760058701546129c9565b9460018060a01b03609954166040516370a0823160e01b81523360048201528681602481855afa801561071f578891600091612486575b501061244157803b1561033057604051632770a7eb60e21b815233600482015260248101979097526000908790604490829084905af195861561071f577f338e0cd33c4e120afcd73f43f082fd8940ed67ac35180d278d2eb4f3ed51d92e96612432575b5060088101903360005281865282604060002054161561241e575b50336000528452604060002090815491816123ed85828616612a39565b1663ffffffff19809416179055612408845493828516612a39565b1691161790556040519384523393a36001606555005b61242c906006339101612a51565b886123d0565b61243b90612860565b886123b5565b60405162461bcd60e51b815260048101879052601b60248201527f526166666c653a20696e73756666696369656e7420706f696e747300000000006044820152606490fd5b809250888092503d83116124b0575b61249f818361288e565b81010312610330578790518b612351565b503d612495565b60405162461bcd60e51b815260048101859052601b60248201527f526166666c653a206d6178207469636b657473207265616368656400000000006044820152606490fd5b60405162461bcd60e51b815260048101849052601860248201527f526166666c653a206e6f7420696e2074696d656672616d6500000000000000006044820152606490fd5b5060028401544211156122e6565b3461033057600036600319011261033057609b546040516001600160a01b039091168152602090f35b34610330576000366003190112610330576020609d54604051908152f35b3461033057602080600319360112610330576004356125b3612c0e565b80600052609e82526125cb604060002054151561293e565b80600052609e825260406000209060078201928354936125ed60ff861661298a565b60028401544211156127865763ffffffff9060648260098701541602958287169687036113245760039683600388015416906014820291808304601414901517156113245710156127495760ff1916905591926008810192906006810160005b815481101561271c5761266081836129dc565b90546001600160a01b03918a1b1c811660008181528888526040902054919291861680612694575b5050600191500161264d565b60058601546126a2916129c9565b9260995416803b15610330576040516340c10f1960e01b81526001600160a01b038316600482015260248101949094526000908490604490829084905af192831561071f5760019361270d575b50600052868652604060002063ffffffff1981541690558980612688565b61271690612860565b8a6126ef565b867f2a7d48246875b5f17dc9944def25fc8fe90e524ca2165e290ffdc0e44a0bf8b6600080a26001606555005b60405162461bcd60e51b8152600481018590526015602482015274149859999b194e881d1a1c995cda1bdb19081b595d605a1b6044820152606490fd5b60405162461bcd60e51b8152600481018390526011602482015270149859999b194e881b9bdd08195b991959607a1b6044820152606490fd5b3461033057600036600319011261033057609a546040516001600160a01b039091168152602090f35b3461033057604036600319011261033057602090612804612834565b600435600052609e835260086040600020019060018060a01b0316600052825263ffffffff604060002054168152f35b602435906001600160a01b038216820361033057565b600435906001600160a01b038216820361033057565b6001600160401b038111610b7357604052565b606081019081106001600160401b03821117610b7357604052565b90601f801991011681019081106001600160401b03821117610b7357604052565b6001600160401b038111610b7357601f01601f191660200190565b9291926128d6826128af565b916128e4604051938461288e565b829481845281830111610330578281602093846000960137010152565b90815180825260208080930193019160005b828110612921575050505090565b83516001600160a01b031685529381019392810192600101612913565b1561294557565b60405162461bcd60e51b815260206004820152601c60248201527f526166666c653a20726f756e6420646f6573206e6f74206578697374000000006044820152606490fd5b1561299157565b60405162461bcd60e51b815260206004820152601060248201526f526166666c653a20696e61637469766560801b6044820152606490fd5b8181029291811591840414171561132457565b80548210156117235760005260206000200190600090565b156129fb57565b60405162461bcd60e51b8152602060048201526016602482015275149859999b194e881a5b9858dd1a5d99481c9bdd5b9960521b6044820152606490fd5b91909163ffffffff8080941691160191821161132457565b805468010000000000000000811015610b7357612a73916001820181556129dc565b60018060a09493941b038084549260031b9316831b921b1916179055565b15612a9857565b60405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b19195b1959d85d1958d85b1b60a21b6064820152608490fd5b15612af957565b60405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b6163746976652070726f787960a01b6064820152608490fd5b9190820391821161132457565b90816020910312610330575180151581036103305790565b15612b7f57565b60405162461bcd60e51b81526020600482015260116024820152702930b33336329d103737ba1037bbb732b960791b6044820152606490fd5b9190820180921161132457565b60001981146113245760010190565b90600182811c92168015612c04575b6020831014612bee57565b634e487b7160e01b600052602260045260246000fd5b91607f1691612be3565b600260655414612c1f576002606555565b60405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606490fd5b90816020910312610330575163ffffffff811681036103305790565b6001600160401b038111610b735760051b60200190565b8051156117235760200190565b8051600110156117235760400190565b8051600210156117235760600190565b80518210156117235760209160051b010190565b90612ce282612c80565b612cef604051918261288e565b8281528092612d00601f1991612c80565b0190602036910137565b60405163a9059cbb60e01b60208201526001600160a01b03929092166024830152604480830193909352918152612d4b91612d4660648361288e565b612ef3565b565b15612d5457565b60405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608490fd5b803b15612de2576000805160206130e983398151915280546001600160a01b0319166001600160a01b03909216919091179055565b60405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608490fd5b9091600090815b600684018054841015612eb55783612e5b916129dc565b905460039190911b1c6001600160a01b0316600081815260088601602052604090205463ffffffff169190612e908383612bb8565b8710612eab5750600191612ea391612bb8565b920191612e44565b9450505092505090565b60405162461bcd60e51b8152602060048201526016602482015275526166666c653a20696e646578206f766572666c6f7760501b6044820152606490fd5b60408051908101916001600160a01b03166001600160401b03831182841017610b7357612f5c926040526000806020958685527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656487860152868151910182855af1611f4f612fe4565b805190828215928315612fcc575b50505015612f755750565b6084906040519062461bcd60e51b82526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152fd5b612fdc9350820181019101612b60565b388281612f6a565b3d1561300f573d90612ff5826128af565b91613003604051938461288e565b82523d6000602084013e565b606090565b919290156130765750815115613028575090565b3b156130315790565b60405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606490fd5b8251909150156130895750805190602001fd5b6040519062461bcd60e51b82528160208060048301528251908160248401526000935b8285106130cf575050604492506000838284010152601f80199101168101030190fd5b84810182015186860160440152938101938593506130ac56fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca164736f6c6343000818000a","id":1,"type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"artifactId":"AMilesV3#akiba_impl","constructorArgs":[],"contractName":"AkibaRaffleV3","dependencies":[],"from":"0x03909bb1e9799336d4a8c49b74343c2a85fdad9d","futureId":"AMilesV3#akiba_impl","futureType":"NAMED_ARTIFACT_CONTRACT_DEPLOYMENT","libraries":{},"strategy":"basic","strategyConfig":{},"type":"DEPLOYMENT_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"AMilesV3#akiba_impl","networkInteraction":{"data":"0x60a08060405234610031573060805261312b90816100378239608051818181611aa201528181611ba20152611e140152f35b600080fdfe608080604052600436101561001357600080fd5b60003560e01c90816309c79735146127fe575080631459457a146125f55780631fccf672146125cc578063234d0001146123a357806324214191146123855780632f48ab7d1461235c5780633423ce821461207b5780633659cfe614611df05780634f1ef28614611b5357806352d1902d14611a8f5780635ee49b8f1461193e57806360b2a56a14610cc357806371533fe514610c9a5780637509f58614610c25578063866b1be314610bd45780638da5cb5b14610bab578063958d9c4614610648578063cf456ae7146105b0578063d9caed12146103df578063df5cf2b114610339578063e200c857146102ac578063e6c81c7214610283578063e84daf0a1461025a578063f2fde38b146101b0578063f46eccc4146101715763f71492201461013d57600080fd5b3461016c57600036600319011261016c57602060405173c0ffee98ad1434acbdb894bbb752e138c1006fab8152f35b600080fd5b3461016c57602036600319011261016c576001600160a01b03610192612860565b1660005260a0602052602060ff604060002054166040519015158152f35b3461016c57602036600319011261016c576101c9612860565b6097546001600160a01b03808216926101e3338514612b8e565b169182156102225782907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a36001600160a01b03191617609755005b60405162461bcd60e51b815260206004820152601060248201526f27bbb732b91d103d32b9379030b2323960811b6044820152606490fd5b3461016c57600036600319011261016c576099546040516001600160a01b039091168152602090f35b3461016c57600036600319011261016c576098546040516001600160a01b039091168152602090f35b3461016c5760208060031936011261016c57600435600052609e8152600660406000200190604051808383829554938481520190600052836000209260005b8582821061031a57505050610302925003836128a4565b610316604051928284938452830190612917565b0390f35b85546001600160a01b03168452600195860195889550930192016102eb565b3461016c57602036600319011261016c5761012060043580600052609e60205260ff60406000206007810154906103718383166129a0565b600181015490600281015460038201549063ffffffff80600985015416916005600486015495015495604051998a5260208a0152604089015282166060880152608087015260018060a01b039060201c1660a086015260c085015260e084015260081c161515610100820152f35b3461016c57606036600319011261016c576103f8612860565b61040061284a565b6044359060018060a01b0361041a81609754163314612b8e565b808216938415610575578315610538571691604051916370a0823160e01b83523060048401526020928381602481885afa90811561052c576000916104ff575b5084600052609f845260406000205480821191826104eb575b5050156104b157906104a8817f9b1bfa7fa9ee420a16e124f794c35ac9f90472acc99140eb2f6447c714cad8eb949386612d80565b604051908152a3005b60405162461bcd60e51b815260048101849052601260248201527115da5d1a191c985dce881c995cd95c9d995960721b6044820152606490fd5b6104f59250612b69565b8211158680610473565b90508381813d8311610525575b61051681836128a4565b8101031261016c57518661045a565b503d61050c565b6040513d6000823e3d90fd5b60405162461bcd60e51b815260206004820152601560248201527415da5d1a191c985dce881e995c9bc8185b5bdd5b9d605a1b6044820152606490fd5b60405162461bcd60e51b81526020600482015260136024820152722bb4ba34323930bb9d103d32b9379030b2323960691b6044820152606490fd5b3461016c57604036600319011261016c576105c9612860565b6024359081151580920361016c576097546001600160a01b0391906105f19083163314612b8e565b1680156106175760005260a060205260406000209060ff80198354169116179055600080f35b60405162461bcd60e51b81526020600482015260096024820152682d32b9379030b2323960b91b6044820152606490fd5b3461016c5761010036600319011261016c5760443563ffffffff8116810361016c576064356001600160a01b038116900361016c5760843560ff8116810361016c5760e4356001600160401b03811161016c573660238201121561016c576106ba9036906024816004013591016128e0565b9060018060a01b036097541633141580610b92575b610b8157602435151580610b72575b15610b38574260043510610afb576064356001600160a01b031615610ac157600360ff821611610a7c57600360ff8216141580610a72575b610a1557609c546001600160a01b0390811660643590911603610996575b61073f609d54612bdb565b9283609d5583600052609e6020526040600020938455600435600185015561076b602435600435612bce565b6002850155600384015463ffffffff640100000000600160c01b0360643560201b169216906001600160401b0360c01b161717600384015560a435600484015560c435600584015560ff60078401918119926001848254161790551690600c8401541617600c8301558051906001600160401b0382116109805781906107f4600d850154612bea565b601f811161092d575b50602090601f83116001146108bb576000926108b0575b50508160011b916000199060031b1c191617600d8201555b7f452eb14dda7e8bf2507d69049b0adbe025e32286bd6398252780fc0edaefbf1a60e082549260018101549060028101549063ffffffff600482015460038301549060ff600c600586015495015416946040519687526020870152604086015260018060a01b038160201c16606086015216608084015260a083015260c0820152a2005b015190508380610814565b9250600d84016000526020600020906000935b601f1984168510610912576001945083601f198116106108f9575b505050811b01600d82015561082c565b015160001960f88460031b161c191690558380806108e9565b818101518355602094850194600190930192909101906108ce565b909150600d84016000526020600020601f840160051c810160208510610979575b90849392915b601f830160051c8201811061096a5750506107fd565b60008155859450600101610954565b508061094e565b634e487b7160e01b600052604160045260246000fd5b6040516323b872dd60e01b602082015233602482015230604482015260a4356064820152606481528060a08101106001600160401b0360a083011117610980578060a06109e99201604052606435612f09565b60018060a01b0360643516600052609f6020526040600020610a0e60a4358254612bce565b9055610734565b60405162461bcd60e51b815260206004820152602f60248201527f526166666c653a2030205265776172647320666f72204469676974616c20436160448201526e73682f4d696c657320526166666c6560881b6064820152608490fd5b5060a43515610716565b60405162461bcd60e51b815260206004820152601860248201527f526166666c653a207479706520756e737570706f7274656400000000000000006044820152606490fd5b60405162461bcd60e51b81526020600482015260126024820152712930b33336329d103d32b937903a37b5b2b760711b6044820152606490fd5b60405162461bcd60e51b8152602060048201526015602482015274149859999b194e881cdd185c9d081a5b881c185cdd605a1b6044820152606490fd5b60405162461bcd60e51b8152602060048201526012602482015271526166666c653a2062616420706172616d7360701b6044820152606490fd5b5063ffffffff831615156106de565b6040516282b42960e81b8152600490fd5b503360005260a060205260ff60406000205416156106cf565b3461016c57600036600319011261016c576097546040516001600160a01b039091168152602090f35b3461016c57602036600319011261016c57610bed612860565b6097546001600160a01b039190610c079083163314612b8e565b166bffffffffffffffffffffffff60a01b6098541617609855600080f35b3461016c5760208060031936011261016c57600435600052609e8152600b60406000200190604051808383829554938481520190600052836000209260005b85828210610c7b57505050610302925003836128a4565b85546001600160a01b0316845260019586019588955093019201610c64565b3461016c57600036600319011261016c57609c546040516001600160a01b039091168152602090f35b3461016c57602036600319011261016c57610cdc612c84565b600435600052609e602052610cf76040600020541515612954565b600435600052609e602052604060002060ff6007820154610d19828216612a0a565b60081c16611901576002810154421180156118e7575b156118ad57600381015463ffffffff8116601481029080820460141490151715611131576064900463ffffffff6009840154161061186857600a82015480151590816117f1575b50156117ac57609c546001600160a01b0360209290921c821691168103611786575b50600c8101805460ff1680610f8357505063ffffffff600982015416600a820154604051916324cbbfc160e01b8352600483015260006024830152604482015260208160648173c0ffee98ad1434acbdb894bbb752e138c1006fab5afa90811561052c57610e169163ffffffff91600091610f54575b501682612e53565b90610e2482600b8301612a67565b60078101805461ffff19166101001790556003810154609c5460209190911c6001600160a01b0390811691168103610f1957506099546004820154906001600160a01b0316803b1561016c576040516340c10f1960e01b81526001600160a01b038516600482015260248101929092526000908290604490829084905af1801561052c577ffee5b04775e1cd2311ed22cd00f5d2403aff38ff6f71d6d393f51854ed6bc98692610eff92600492610f0a575b505b0154604080516001600160a01b039095168552602085019190915260043593918291820190565b0390a25b6001606555005b610f1390612876565b85610ed6565b600482610f4f610eff9386847ffee5b04775e1cd2311ed22cd00f5d2403aff38ff6f71d6d393f51854ed6bc98697015491612d80565b610ed8565b610f76915060203d602011610f7c575b610f6e81836128a4565b810190612cda565b84610e0e565b503d610f64565b6001811490811561177b575b501561158b575460ff16600181036114b55750604051608081018181106001600160401b03821117610980576040526003815260603660208301376014610fed826032610fdb82612d0d565b52601e610fe782612d1a565b52612d2a565b525b610ff98151612d4e565b6000805b83518083109081611498575b50156111475763ffffffff60098601541660018201821161113157600a860154604051916324cbbfc160e01b83526004830152600183016024830152604482015260208160648173c0ffee98ad1434acbdb894bbb752e138c1006fab5afa90811561052c576110889163ffffffff91600091611112575b501686612e53565b6000805b8481106110e3575b50156110aa575b506110a590612bdb565b610ffd565b90916110a5916110dc91906110d7906001600160a01b0381166110cd8489612d3a565b52600b8901612a67565b612bdb565b919061109b565b6001600160a01b03838116906110f98389612d3a565b5116146111085760010161108c565b5050600187611094565b61112b915060203d602011610f7c57610f6e81836128a4565b88611080565b634e487b7160e01b600052601160045260246000fd5b5090928115611453576000805b83811061142d575061116583612cf6565b9361117360405195866128a4565b83855261117f84612cf6565b601f1901366020870137600090600185036113765750505060048101546111a584612d0d565b525b60078101805461ffff19166101001790556003810154609c546001600160a01b0390811660209290921c1603611326575060005b8181106112a157505b6111ed81612d4e565b9060005b81811061127957505090915061121260405191604083526040830190612917565b81810360208301526020808451928381520193019060005b81811061126357505050807f6f2086a232e2eb114d9bb965c9edf2040c10252db76bd117307631c4bfc82b4091600435930390a2610f03565b825185526020948501949092019160010161122a565b6001906001600160a01b0361128e8288612d3a565b511661129a8286612d3a565b52016111f1565b6099546001600160a01b0390811691906112bb8287612d3a565b51166112c78286612d3a565b51833b1561016c576040516340c10f1960e01b81526001600160a01b039290921660048301526024820152916000908390604490829084905af191821561052c57600192611317575b50016111db565b61132090612876565b85611310565b60005b8281106113375750506111e4565b6003820154600191906113709060201c6001600160a01b039081169061135d848a612d3a565b51166113698489612d3a565b5191612d80565b01611329565b9091939294956000936004870154935b6000198201828111611131578610156114005761ffff6113b2816113aa8988612d3a565b5116876129df565b91818916156113ea576001926113e2928a1690046113d0898d612d3a565b526113db888c612d3a565b5190612bce565b950194611386565b634e487b7160e01b600052601260045260246000fd5b925094509594925061141191612b69565b6000198301838111611131576114279085612d3a565b526111a7565b9061ffff90818061143e8589612d3a565b51169116019081116111315790600101611154565b60405162461bcd60e51b815260206004820152601960248201527f526166666c653a206e6f20756e697175652077696e6e657273000000000000006044820152606490fd5b80915060041b908082046010149015171561113157811086611009565b6002036115465760405160c081018181106001600160401b03821117610980576040526005815260a03660208301378060326114f082612d0d565b5260196114fc82612d1a565b52600f61150882612d2a565b5280516003101561153057600a60808201528051600410156115305760a0600a910152610fef565b634e487b7160e01b600052603260045260246000fd5b60405162461bcd60e51b815260206004820152601a60248201527f526166666c653a20696e76616c696420726166666c65547970650000000000006044820152606490fd5b5063ffffffff600982015416600a820154604051916324cbbfc160e01b8352600483015260006024830152604482015260208160648173c0ffee98ad1434acbdb894bbb752e138c1006fab5afa90811561052c576115f89163ffffffff91600091610f5457501682612e53565b61160581600b8401612a67565b60078201805461ffff19166101001790556098546040516303a9a7b360e41b81526001600160a01b039283166004808301829052356001600160401b0316602483015260006044830181905260806064840152600d909501805491959294939093169284929161167481612bea565b9182608486015260a4916001811690816000146117525750600114611714575b505050918160008160209503925af1801561052c576116e9575b50604051908152600160208201527ffee5b04775e1cd2311ed22cd00f5d2403aff38ff6f71d6d393f51854ed6bc986604060043592a2610f03565b602090813d831161170d575b6116ff81836128a4565b8101031261016c57816116ae565b503d6116f5565b6000908152602081209093505b82841061173957505050810160a40181600081611694565b8054848801830152869450602090930192600101611721565b60ff191660a48088019190915293151560051b8601909301935084925060009150829050611694565b600291501483610f8f565b600482015490600052609f6020526117a46040600020918254612b69565b905581610d98565b60405162461bcd60e51b815260206004820152601a60248201527f526166666c653a2072616e646f6d6e6573732070656e64696e670000000000006044820152606490fd5b9050604051906326f21bfb60e21b8252600482015260208160248173c0ffee98ad1434acbdb894bbb752e138c1006fab5afa90811561052c57600091611839575b5083610d76565b61185b915060203d602011611861575b61185381836128a4565b810190612b76565b83611832565b503d611849565b60405162461bcd60e51b815260206004820152601960248201527f526166666c653a207468726573686f6c64206e6f74206d6574000000000000006044820152606490fd5b60405162461bcd60e51b8152602060048201526012602482015271149859999b194e881d5b999a5b9a5cda195960721b6044820152606490fd5b5063ffffffff806009830154169060038301541614610d2f565b60405162461bcd60e51b81526020600482015260156024820152742930b33336329d1030b63932b0b23c90323930bbb760591b6044820152606490fd5b60208060031936011261016c576004359081600052609e81526119676040600020541515612954565b81600052609e8152600a604060002001908154611a4b576040516334cd994560e11b815281816004813473c0ffee98ad1434acbdb894bbb752e138c1006fab5af190811561052c57600091611a1e575b504383553481106119f0575b507f3d94fecedaa4f90b8bd459797adb95f5bb11426025c5541390d9ccc1ad1b60a19154604051908152a2005b600080806119ff819434612b69565b818115611a15575b3390f11561052c57836119c3565b506108fc611a07565b90508181813d8311611a44575b611a3581836128a4565b8101031261016c5751846119b7565b503d611a2b565b6064906040519062461bcd60e51b82526004820152601c60248201527f526166666c653a2072616e646f6d6e65737320726571756573746564000000006044820152fd5b3461016c57600036600319011261016c577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163003611ae85760206040516000805160206130ff8339815191528152f35b60405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608490fd5b604036600319011261016c57611b67612860565b6024356001600160401b03811161016c573660238201121561016c57611b979036906024816004013591016128e0565b906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811690611bd030831415612aa7565b611bed6000805160206130ff833981519152928284541614612b08565b611bfc81609754163314612b8e565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615611c34575050611c329150612dc3565b005b6040516352d1902d60e01b81526020939291831691908481600481865afa60009181611dc1575b50611cbc5760405162461bcd60e51b815260048101869052602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608490fd5b03611d6a57611cca82612dc3565b7fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2825115801590611d62575b611d0057005b600080611c329460405194611d1486612889565b602786527f416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c81870152660819985a5b195960ca1b604087015281519101845af4611d5c612ffa565b9161302a565b506001611cfa565b60405162461bcd60e51b815260048101849052602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608490fd5b9091508581813d8311611de9575b611dd981836128a4565b8101031261016c57519087611c5b565b503d611dcf565b3461016c5760208060031936011261016c57611e0a612860565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169290611e4330851415612aa7565b611e606000805160206130ff833981519152948286541614612b08565b611e6f81609754163314612b8e565b60405193828501918583106001600160401b0384111761098057826040526000865260ff7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435416600014611ecb5750505050611c329150612dc3565b84939416906040516352d1902d60e01b81528581600481865afa6000918161204c575b50611f4f5760405162461bcd60e51b815260048101879052602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608490fd5b03611ff557611f5d83612dc3565b7fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2835115801590611fed575b611f9357005b60008091611c32957f416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c60405196611fc988612889565b60278852870152660819985a5b195960ca1b60408701525190845af4611d5c612ffa565b506000611f8d565b60405162461bcd60e51b815260048101859052602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608490fd5b9091508681813d8311612074575b61206481836128a4565b8101031261016c57519088611eee565b503d61205a565b3461016c57604036600319011261016c576004356024359063ffffffff918281169283820361016c5782600052602090609e82526120bf6040600020541515612954565b6120c7612c84565b83600052609e82526040600020926120e560ff600786015416612a0a565b60018401544210158061234e575b1561230957600984019161210a8282855416612a4f565b81806003880154169116116122c4576121278760058701546129df565b9460018060a01b03609954166040516370a0823160e01b81523360048201528681602481855afa801561052c578891600091612293575b501061224e57803b1561016c57604051632770a7eb60e21b815233600482015260248101979097526000908790604490829084905af195861561052c577f338e0cd33c4e120afcd73f43f082fd8940ed67ac35180d278d2eb4f3ed51d92e9661223f575b5060088101903360005281865282604060002054161561222b575b50336000528452604060002090815491816121fa85828616612a4f565b1663ffffffff19809416179055612215845493828516612a4f565b1691161790556040519384523393a36001606555005b612239906006339101612a67565b886121dd565b61224890612876565b886121c2565b60405162461bcd60e51b815260048101879052601b60248201527f526166666c653a20696e73756666696369656e7420706f696e747300000000006044820152606490fd5b809250888092503d83116122bd575b6122ac81836128a4565b8101031261016c578790518b61215e565b503d6122a2565b60405162461bcd60e51b815260048101859052601b60248201527f526166666c653a206d6178207469636b657473207265616368656400000000006044820152606490fd5b60405162461bcd60e51b815260048101849052601860248201527f526166666c653a206e6f7420696e2074696d656672616d6500000000000000006044820152606490fd5b5060028401544211156120f3565b3461016c57600036600319011261016c57609b546040516001600160a01b039091168152602090f35b3461016c57600036600319011261016c576020609d54604051908152f35b3461016c5760208060031936011261016c576004356123c0612c84565b80600052609e82526123d86040600020541515612954565b80600052609e825260406000209060078201928354936123fa60ff86166129a0565b60028401544211156125935763ffffffff9060648260098701541602958287169687036111315760039683600388015416906014820291808304601414901517156111315710156125565760ff1916905591926008810192906006810160005b81548110156125295761246d81836129f2565b90546001600160a01b03918a1b1c8116600081815288885260409020549192918616806124a1575b5050600191500161245a565b60058601546124af916129df565b9260995416803b1561016c576040516340c10f1960e01b81526001600160a01b038316600482015260248101949094526000908490604490829084905af192831561052c5760019361251a575b50600052868652604060002063ffffffff1981541690558980612495565b61252390612876565b8a6124fc565b867f2a7d48246875b5f17dc9944def25fc8fe90e524ca2165e290ffdc0e44a0bf8b6600080a26001606555005b60405162461bcd60e51b8152600481018590526015602482015274149859999b194e881d1a1c995cda1bdb19081b595d605a1b6044820152606490fd5b60405162461bcd60e51b8152600481018390526011602482015270149859999b194e881b9bdd08195b991959607a1b6044820152606490fd5b3461016c57600036600319011261016c57609a546040516001600160a01b039091168152602090f35b3461016c5760a036600319011261016c5761260e612860565b61261661284a565b6001600160a01b0390604435828116919082900361016c5760643583811680910361016c576084359284841680940361016c576000549460ff8660081c1615958680976127f1575b80156127da575b1561277e5760ff1981166001176000558661276c575b5080600054976126a260ff8a60081c1661269481612c24565b61269d81612c24565b612c24565b600160655516938415612732576bffffffffffffffffffffffff60a01b948086609954161760995585609c541617609c551683609a541617609a5582609b541617609b5581609854161760985560975416176097556126fd57005b61ff0019166000557f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498602060405160018152a1005b60405162461bcd60e51b8152602060048201526012602482015271696e76616c6964204d696e69506f696e747360701b6044820152606490fd5b61ffff1916610101176000558761267b565b60405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608490fd5b50303b1580156126655750600160ff821614612665565b50600160ff82161061265e565b3461016c57604036600319011261016c5760209061281a61284a565b600435600052609e835260086040600020019060018060a01b0316600052825263ffffffff604060002054168152f35b602435906001600160a01b038216820361016c57565b600435906001600160a01b038216820361016c57565b6001600160401b03811161098057604052565b606081019081106001600160401b0382111761098057604052565b90601f801991011681019081106001600160401b0382111761098057604052565b6001600160401b03811161098057601f01601f191660200190565b9291926128ec826128c5565b916128fa60405193846128a4565b82948184528183011161016c578281602093846000960137010152565b90815180825260208080930193019160005b828110612937575050505090565b83516001600160a01b031685529381019392810192600101612929565b1561295b57565b60405162461bcd60e51b815260206004820152601c60248201527f526166666c653a20726f756e6420646f6573206e6f74206578697374000000006044820152606490fd5b156129a757565b60405162461bcd60e51b815260206004820152601060248201526f526166666c653a20696e61637469766560801b6044820152606490fd5b8181029291811591840414171561113157565b80548210156115305760005260206000200190600090565b15612a1157565b60405162461bcd60e51b8152602060048201526016602482015275149859999b194e881a5b9858dd1a5d99481c9bdd5b9960521b6044820152606490fd5b91909163ffffffff8080941691160191821161113157565b80546801000000000000000081101561098057612a89916001820181556129f2565b60018060a09493941b038084549260031b9316831b921b1916179055565b15612aae57565b60405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b19195b1959d85d1958d85b1b60a21b6064820152608490fd5b15612b0f57565b60405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b6163746976652070726f787960a01b6064820152608490fd5b9190820391821161113157565b9081602091031261016c5751801515810361016c5790565b15612b9557565b60405162461bcd60e51b81526020600482015260116024820152702930b33336329d103737ba1037bbb732b960791b6044820152606490fd5b9190820180921161113157565b60001981146111315760010190565b90600182811c92168015612c1a575b6020831014612c0457565b634e487b7160e01b600052602260045260246000fd5b91607f1691612bf9565b15612c2b57565b60405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608490fd5b600260655414612c95576002606555565b60405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606490fd5b9081602091031261016c575163ffffffff8116810361016c5790565b6001600160401b0381116109805760051b60200190565b8051156115305760200190565b8051600110156115305760400190565b8051600210156115305760600190565b80518210156115305760209160051b010190565b90612d5882612cf6565b612d6560405191826128a4565b8281528092612d76601f1991612cf6565b0190602036910137565b60405163a9059cbb60e01b60208201526001600160a01b03929092166024830152604480830193909352918152612dc191612dbc6064836128a4565b612f09565b565b803b15612df8576000805160206130ff83398151915280546001600160a01b0319166001600160a01b03909216919091179055565b60405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608490fd5b9091600090815b600684018054841015612ecb5783612e71916129f2565b905460039190911b1c6001600160a01b0316600081815260088601602052604090205463ffffffff169190612ea68383612bce565b8710612ec15750600191612eb991612bce565b920191612e5a565b9450505092505090565b60405162461bcd60e51b8152602060048201526016602482015275526166666c653a20696e646578206f766572666c6f7760501b6044820152606490fd5b60408051908101916001600160a01b03166001600160401b0383118284101761098057612f72926040526000806020958685527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656487860152868151910182855af1611d5c612ffa565b805190828215928315612fe2575b50505015612f8b5750565b6084906040519062461bcd60e51b82526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152fd5b612ff29350820181019101612b76565b388281612f80565b3d15613025573d9061300b826128c5565b9161301960405193846128a4565b82523d6000602084013e565b606090565b9192901561308c575081511561303e575090565b3b156130475790565b60405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606490fd5b82519091501561309f5750805190602001fd5b6040519062461bcd60e51b82528160208060048301528251908160248401526000935b8285106130e5575050604492506000838284010152601f80199101168101030190fd5b84810182015186860160440152938101938593506130c256fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca164736f6c6343000818000a","id":1,"type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"AMilesV3#akiba_impl","networkInteractionId":1,"nonce":3,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"AMilesV3#akiba_impl","networkInteractionId":1,"nonce":3,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"50001000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"1000000"}},"hash":"0x3aa6739f8e74d518ce9ff2ff94a90bd54a225187d93f5881793e1648168baed9"},"type":"TRANSACTION_SEND"} +{"futureId":"AMilesV3#akiba_impl","hash":"0x3aa6739f8e74d518ce9ff2ff94a90bd54a225187d93f5881793e1648168baed9","networkInteractionId":1,"receipt":{"blockHash":"0x8695777d5da91df7b9b491b5a833de03c2aff26145f4beefec48c6ca3151fee3","blockNumber":55939429,"contractAddress":"0x10EA378Ea0429c27A892d9349C0cC5fC373bd9cb","logs":[],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"AMilesV3#akiba_impl","result":{"address":"0x10EA378Ea0429c27A892d9349C0cC5fC373bd9cb","type":"SUCCESS"},"type":"DEPLOYMENT_EXECUTION_STATE_COMPLETE"} +{"artifactId":"AMilesV3#akiba_proxy","constructorArgs":["0x10EA378Ea0429c27A892d9349C0cC5fC373bd9cb","0x1459457a000000000000000000000000d59ae111d976342ff58c6de2b6f2b002415825c1000000000000000000000000874069fa1eb16d44d622f2e0ca25eea172369bc100000000000000000000000048065fbbe25f71c9282ddf5e1cd6d6a887483d5e0000000000000000000000008f60907f41593d4b41f5e0cea48415cd61854a7900000000000000000000000003909bb1e9799336d4a8c49b74343c2a85fdad9d"],"contractName":"ERC1967Proxy","dependencies":["AMilesV3#akiba_impl"],"from":"0x03909bb1e9799336d4a8c49b74343c2a85fdad9d","futureId":"AMilesV3#akiba_proxy","futureType":"NAMED_ARTIFACT_CONTRACT_DEPLOYMENT","libraries":{},"strategy":"basic","strategyConfig":{},"type":"DEPLOYMENT_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"AMilesV3#akiba_proxy","networkInteraction":{"data":"0x6040608081526103ed908138038061001681610218565b93843982019181818403126102135780516001600160a01b038116808203610213576020838101516001600160401b0394919391858211610213570186601f820112156102135780519061007161006c83610253565b610218565b918083528583019886828401011161021357888661008f930161026e565b813b156101b9577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b031916841790556000927fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b8480a28051158015906101b2575b61010b575b855160a890816103458239f35b855194606086019081118682101761019e578697849283926101889952602788527f416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c87890152660819985a5b195960ca1b8a8901525190845af4913d15610194573d9061017a61006c83610253565b91825281943d92013e610291565b508038808080806100fe565b5060609250610291565b634e487b7160e01b84526041600452602484fd5b50826100f9565b855162461bcd60e51b815260048101859052602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608490fd5b600080fd5b6040519190601f01601f191682016001600160401b0381118382101761023d57604052565b634e487b7160e01b600052604160045260246000fd5b6001600160401b03811161023d57601f01601f191660200190565b60005b8381106102815750506000910152565b8181015183820152602001610271565b919290156102f357508151156102a5575090565b3b156102ae5790565b60405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606490fd5b8251909150156103065750805190602001fd5b6044604051809262461bcd60e51b825260206004830152610336815180928160248601526020868601910161026e565b601f01601f19168101030190fdfe608060405236156054577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc54600090819081906001600160a01b0316368280378136915af43d82803e156050573d90f35b3d90fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc54600090819081906001600160a01b0316368280378136915af43d82803e156050573d90f3fea164736f6c6343000818000a00000000000000000000000010ea378ea0429c27a892d9349c0cc5fc373bd9cb000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a41459457a000000000000000000000000d59ae111d976342ff58c6de2b6f2b002415825c1000000000000000000000000874069fa1eb16d44d622f2e0ca25eea172369bc100000000000000000000000048065fbbe25f71c9282ddf5e1cd6d6a887483d5e0000000000000000000000008f60907f41593d4b41f5e0cea48415cd61854a7900000000000000000000000003909bb1e9799336d4a8c49b74343c2a85fdad9d00000000000000000000000000000000000000000000000000000000","id":1,"type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"AMilesV3#akiba_proxy","networkInteractionId":1,"nonce":4,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"AMilesV3#akiba_proxy","networkInteractionId":1,"nonce":4,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"50001000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"1000000"}},"hash":"0x53784ae8c3016df4e88b60a3bda2fec9f0b1c8626b19824d197efbd23a5e9383"},"type":"TRANSACTION_SEND"} +{"futureId":"AMilesV3#akiba_proxy","hash":"0x53784ae8c3016df4e88b60a3bda2fec9f0b1c8626b19824d197efbd23a5e9383","networkInteractionId":1,"receipt":{"blockHash":"0x5742ec62ce1fcf4a5726d26c2efcd4dbd33b5e674b929a77b70940c5934d7f74","blockNumber":55939440,"contractAddress":"0x72fEFD4e943475c5cB7Cf11753fE60d04aEb7ff0","logs":[{"address":"0x72fEFD4e943475c5cB7Cf11753fE60d04aEb7ff0","data":"0x","logIndex":0,"topics":["0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b","0x00000000000000000000000010ea378ea0429c27a892d9349c0cc5fc373bd9cb"]},{"address":"0x72fEFD4e943475c5cB7Cf11753fE60d04aEb7ff0","data":"0x0000000000000000000000000000000000000000000000000000000000000001","logIndex":1,"topics":["0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"AMilesV3#akiba_proxy","result":{"address":"0x72fEFD4e943475c5cB7Cf11753fE60d04aEb7ff0","type":"SUCCESS"},"type":"DEPLOYMENT_EXECUTION_STATE_COMPLETE"} +{"artifactId":"AkibaRaffleV3_Upgrade#AkibaRaffleV3","contractAddress":"0x72fEFD4e943475c5cB7Cf11753fE60d04aEb7ff0","contractName":"AkibaRaffleV3","dependencies":[],"futureId":"AkibaRaffleV3_Upgrade#AkibaRaffleV3","futureType":"NAMED_ARTIFACT_CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"} +{"artifactId":"AkibaRaffleV3_Upgrade#akiba_impl_vNext","constructorArgs":[],"contractName":"AkibaRaffleV3","dependencies":[],"from":"0x03909bb1e9799336d4a8c49b74343c2a85fdad9d","futureId":"AkibaRaffleV3_Upgrade#akiba_impl_vNext","futureType":"NAMED_ARTIFACT_CONTRACT_DEPLOYMENT","libraries":{},"strategy":"basic","strategyConfig":{},"type":"DEPLOYMENT_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"AkibaRaffleV3_Upgrade#akiba_impl_vNext","networkInteraction":{"data":"0x60a0806040523461003157306080526131a190816100378239608051818181611b0401528181611c040152611e760152f35b600080fdfe608080604052600436101561001357600080fd5b60003560e01c90816309c797351461285e575080631459457a146126575780631fccf6721461262e578063234d00011461240557806324214191146123e75780632f48ab7d146123be5780633423ce82146120dd5780633659cfe614611e525780634f1ef28614611bb557806352d1902d14611af15780635ee49b8f146119a057806360b2a56a14610d2557806371533fe514610cfc5780637509f58614610c87578063866b1be314610c365780638da5cb5b14610c0d578063958d9c4614610648578063cf456ae7146105b0578063d9caed12146103df578063df5cf2b114610339578063e200c857146102ac578063e6c81c7214610283578063e84daf0a1461025a578063f2fde38b146101b0578063f46eccc4146101715763f71492201461013d57600080fd5b3461016c57600036600319011261016c57602060405173c0ffee98ad1434acbdb894bbb752e138c1006fab8152f35b600080fd5b3461016c57602036600319011261016c576001600160a01b036101926128c0565b1660005260a0602052602060ff604060002054166040519015158152f35b3461016c57602036600319011261016c576101c96128c0565b6097546001600160a01b03808216926101e3338514612c04565b169182156102225782907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a36001600160a01b03191617609755005b60405162461bcd60e51b815260206004820152601060248201526f27bbb732b91d103d32b9379030b2323960811b6044820152606490fd5b3461016c57600036600319011261016c576099546040516001600160a01b039091168152602090f35b3461016c57600036600319011261016c576098546040516001600160a01b039091168152602090f35b3461016c5760208060031936011261016c57600435600052609e8152600660406000200190604051808383829554938481520190600052836000209260005b8582821061031a575050506103029250038361291a565b61031660405192828493845283019061298d565b0390f35b85546001600160a01b03168452600195860195889550930192016102eb565b3461016c57602036600319011261016c5761012060043580600052609e60205260ff6040600020600781015490610371838316612a16565b600181015490600281015460038201549063ffffffff80600985015416916005600486015495015495604051998a5260208a0152604089015282166060880152608087015260018060a01b039060201c1660a086015260c085015260e084015260081c161515610100820152f35b3461016c57606036600319011261016c576103f86128c0565b6104006128aa565b6044359060018060a01b0361041a81609754163314612c04565b808216938415610575578315610538571691604051916370a0823160e01b83523060048401526020928381602481885afa90811561052c576000916104ff575b5084600052609f845260406000205480821191826104eb575b5050156104b157906104a8817f9b1bfa7fa9ee420a16e124f794c35ac9f90472acc99140eb2f6447c714cad8eb949386612df6565b604051908152a3005b60405162461bcd60e51b815260048101849052601260248201527115da5d1a191c985dce881c995cd95c9d995960721b6044820152606490fd5b6104f59250612bdf565b8211158680610473565b90508381813d8311610525575b610516818361291a565b8101031261016c57518661045a565b503d61050c565b6040513d6000823e3d90fd5b60405162461bcd60e51b815260206004820152601560248201527415da5d1a191c985dce881e995c9bc8185b5bdd5b9d605a1b6044820152606490fd5b60405162461bcd60e51b81526020600482015260136024820152722bb4ba34323930bb9d103d32b9379030b2323960691b6044820152606490fd5b3461016c57604036600319011261016c576105c96128c0565b6024359081151580920361016c576097546001600160a01b0391906105f19083163314612c04565b1680156106175760005260a060205260406000209060ff80198354169116179055600080f35b60405162461bcd60e51b81526020600482015260096024820152682d32b9379030b2323960b91b6044820152606490fd5b3461016c5761010036600319011261016c57604480359063ffffffff8216820361016c576106746128d6565b6084359060ff8216820361016c5760e4356001600160401b03811161016c573660238201121561016c576106b2903690602481600401359101612956565b9260018060a01b036097541633141580610bf4575b610be357602435151580610bd4575b15610b9b574260043510610b5f576001600160a01b03821615610b2657600360ff841611610ae257600360ff8416141580610ad8575b610a7c57609c546001600160a01b038381169116141580610a64575b6109df575b50610739609d54612c51565b9384609d5584600052609e60205260406000209485556004356001860155610765602435600435612c44565b600286015560038501805463ffffffff19811663ffffffff8416179091556098549091906001600160a01b038481169116146109be575050600384018054640100000000600160c01b03191660209290921b640100000000600160c01b03169190911790555b60a435600484015560c435600584015560ff60078401918119926001848254161790551690600c8401541617600c8301558051906001600160401b0382116109a857819061081c600d850154612c60565b601f8111610955575b50602090601f83116001146108e3576000926108d8575b50508160011b916000199060031b1c191617600d8201555b7f452eb14dda7e8bf2507d69049b0adbe025e32286bd6398252780fc0edaefbf1a60e082549260018101549060028101549063ffffffff600482015460038301549060ff600c600586015495015416946040519687526020870152604086015260018060a01b038160201c16606086015216608084015260a083015260c0820152a2005b01519050838061083c565b9250600d84016000526020600020906000935b601f198416851061093a576001945083601f19811610610921575b505050811b01600d820155610854565b015160001960f88460031b161c19169055838080610911565b818101518355602094850194600190930192909101906108f6565b909150600d84016000526020600020601f840160051c8101602085106109a1575b90849392915b601f830160051c82018110610992575050610825565b6000815585945060010161097c565b5080610976565b634e487b7160e01b600052604160045260246000fd5b63ffffffff91925016906001600160401b0360c01b161760038401556107cb565b604051906323b872dd60e01b6020830152336024830152309082015260a4356064820152606481528060a08101106001600160401b0360a0830111176109a85760a08101604052610a39906001600160a01b038316612f7f565b60018060a01b038116600052609f6020526040600020610a5c60a4358254612c44565b90558461072d565b506098546001600160a01b0383811691161415610728565b6084907f526166666c653a2030205265776172647320666f72204469676974616c2043616040519162461bcd60e51b835260206004840152602f60248401528201526e73682f4d696c657320526166666c6560881b6064820152fd5b5060a4351561070c565b6064907f526166666c653a207479706520756e737570706f7274656400000000000000006040519162461bcd60e51b83526020600484015260186024840152820152fd5b606490712930b33336329d103d32b937903a37b5b2b760711b6040519162461bcd60e51b83526020600484015260126024840152820152fd5b60649074149859999b194e881cdd185c9d081a5b881c185cdd605a1b6040519162461bcd60e51b83526020600484015260156024840152820152fd5b60649071526166666c653a2062616420706172616d7360701b6040519162461bcd60e51b83526020600484015260126024840152820152fd5b5063ffffffff851615156106d6565b6040516282b42960e81b8152600490fd5b503360005260a060205260ff60406000205416156106c7565b3461016c57600036600319011261016c576097546040516001600160a01b039091168152602090f35b3461016c57602036600319011261016c57610c4f6128c0565b6097546001600160a01b039190610c699083163314612c04565b166bffffffffffffffffffffffff60a01b6098541617609855600080f35b3461016c5760208060031936011261016c57600435600052609e8152600b60406000200190604051808383829554938481520190600052836000209260005b85828210610cdd575050506103029250038361291a565b85546001600160a01b0316845260019586019588955093019201610cc6565b3461016c57600036600319011261016c57609c546040516001600160a01b039091168152602090f35b3461016c57602036600319011261016c57610d3e612cfa565b600435600052609e602052610d5960406000205415156129ca565b600435600052609e602052604060002060ff6007820154610d7b828216612a80565b60081c1661196357600281015442118015611949575b1561190f57600381015463ffffffff8116601481029080820460141490151715611193576064900463ffffffff600984015416106118ca57600a8201548015159081611853575b501561180e57609c546001600160a01b0360209290921c8216911681036117e8575b50600c8101805460ff1680610fe557505063ffffffff600982015416600a820154604051916324cbbfc160e01b8352600483015260006024830152604482015260208160648173c0ffee98ad1434acbdb894bbb752e138c1006fab5afa90811561052c57610e789163ffffffff91600091610fb6575b501682612ec9565b90610e8682600b8301612add565b60078101805461ffff19166101001790556003810154609c5460209190911c6001600160a01b0390811691168103610f7b57506099546004820154906001600160a01b0316803b1561016c576040516340c10f1960e01b81526001600160a01b038516600482015260248101929092526000908290604490829084905af1801561052c577ffee5b04775e1cd2311ed22cd00f5d2403aff38ff6f71d6d393f51854ed6bc98692610f6192600492610f6c575b505b0154604080516001600160a01b039095168552602085019190915260043593918291820190565b0390a25b6001606555005b610f75906128ec565b85610f38565b600482610fb1610f619386847ffee5b04775e1cd2311ed22cd00f5d2403aff38ff6f71d6d393f51854ed6bc98697015491612df6565b610f3a565b610fd8915060203d602011610fde575b610fd0818361291a565b810190612d50565b84610e70565b503d610fc6565b600181149081156117dd575b50156115ed575460ff16600181036115175750604051608081018181106001600160401b038211176109a857604052600381526060366020830137601461104f82603261103d82612d83565b52601e61104982612d90565b52612da0565b525b61105b8151612dc4565b6000805b835180831090816114fa575b50156111a95763ffffffff60098601541660018201821161119357600a860154604051916324cbbfc160e01b83526004830152600183016024830152604482015260208160648173c0ffee98ad1434acbdb894bbb752e138c1006fab5afa90811561052c576110ea9163ffffffff91600091611174575b501686612ec9565b6000805b848110611145575b501561110c575b5061110790612c51565b61105f565b90916111079161113e9190611139906001600160a01b03811661112f8489612db0565b52600b8901612add565b612c51565b91906110fd565b6001600160a01b038381169061115b8389612db0565b51161461116a576001016110ee565b50506001876110f6565b61118d915060203d602011610fde57610fd0818361291a565b886110e2565b634e487b7160e01b600052601160045260246000fd5b50909281156114b5576000805b83811061148f57506111c783612d6c565b936111d5604051958661291a565b8385526111e184612d6c565b601f1901366020870137600090600185036113d857505050600481015461120784612d83565b525b60078101805461ffff19166101001790556003810154609c546001600160a01b0390811660209290921c1603611388575060005b81811061130357505b61124f81612dc4565b9060005b8181106112db5750509091506112746040519160408352604083019061298d565b81810360208301526020808451928381520193019060005b8181106112c557505050807f6f2086a232e2eb114d9bb965c9edf2040c10252db76bd117307631c4bfc82b4091600435930390a2610f65565b825185526020948501949092019160010161128c565b6001906001600160a01b036112f08288612db0565b51166112fc8286612db0565b5201611253565b6099546001600160a01b03908116919061131d8287612db0565b51166113298286612db0565b51833b1561016c576040516340c10f1960e01b81526001600160a01b039290921660048301526024820152916000908390604490829084905af191821561052c57600192611379575b500161123d565b611382906128ec565b85611372565b60005b828110611399575050611246565b6003820154600191906113d29060201c6001600160a01b03908116906113bf848a612db0565b51166113cb8489612db0565b5191612df6565b0161138b565b9091939294956000936004870154935b6000198201828111611193578610156114625761ffff6114148161140c8988612db0565b511687612a55565b918189161561144c57600192611444928a169004611432898d612db0565b5261143d888c612db0565b5190612c44565b9501946113e8565b634e487b7160e01b600052601260045260246000fd5b925094509594925061147391612bdf565b6000198301838111611193576114899085612db0565b52611209565b9061ffff9081806114a08589612db0565b511691160190811161119357906001016111b6565b60405162461bcd60e51b815260206004820152601960248201527f526166666c653a206e6f20756e697175652077696e6e657273000000000000006044820152606490fd5b80915060041b90808204601014901517156111935781108661106b565b6002036115a85760405160c081018181106001600160401b038211176109a8576040526005815260a036602083013780603261155282612d83565b52601961155e82612d90565b52600f61156a82612da0565b5280516003101561159257600a60808201528051600410156115925760a0600a910152611051565b634e487b7160e01b600052603260045260246000fd5b60405162461bcd60e51b815260206004820152601a60248201527f526166666c653a20696e76616c696420726166666c65547970650000000000006044820152606490fd5b5063ffffffff600982015416600a820154604051916324cbbfc160e01b8352600483015260006024830152604482015260208160648173c0ffee98ad1434acbdb894bbb752e138c1006fab5afa90811561052c5761165a9163ffffffff91600091610fb657501682612ec9565b61166781600b8401612add565b60078201805461ffff19166101001790556098546040516303a9a7b360e41b81526001600160a01b039283166004808301829052356001600160401b0316602483015260006044830181905260806064840152600d90950180549195929493909316928492916116d681612c60565b9182608486015260a4916001811690816000146117b45750600114611776575b505050918160008160209503925af1801561052c5761174b575b50604051908152600160208201527ffee5b04775e1cd2311ed22cd00f5d2403aff38ff6f71d6d393f51854ed6bc986604060043592a2610f65565b602090813d831161176f575b611761818361291a565b8101031261016c5781611710565b503d611757565b6000908152602081209093505b82841061179b57505050810160a401816000816116f6565b8054848801830152869450602090930192600101611783565b60ff191660a48088019190915293151560051b86019093019350849250600091508290506116f6565b600291501483610ff1565b600482015490600052609f6020526118066040600020918254612bdf565b905581610dfa565b60405162461bcd60e51b815260206004820152601a60248201527f526166666c653a2072616e646f6d6e6573732070656e64696e670000000000006044820152606490fd5b9050604051906326f21bfb60e21b8252600482015260208160248173c0ffee98ad1434acbdb894bbb752e138c1006fab5afa90811561052c5760009161189b575b5083610dd8565b6118bd915060203d6020116118c3575b6118b5818361291a565b810190612bec565b83611894565b503d6118ab565b60405162461bcd60e51b815260206004820152601960248201527f526166666c653a207468726573686f6c64206e6f74206d6574000000000000006044820152606490fd5b60405162461bcd60e51b8152602060048201526012602482015271149859999b194e881d5b999a5b9a5cda195960721b6044820152606490fd5b5063ffffffff806009830154169060038301541614610d91565b60405162461bcd60e51b81526020600482015260156024820152742930b33336329d1030b63932b0b23c90323930bbb760591b6044820152606490fd5b60208060031936011261016c576004359081600052609e81526119c960406000205415156129ca565b81600052609e8152600a604060002001908154611aad576040516334cd994560e11b815281816004813473c0ffee98ad1434acbdb894bbb752e138c1006fab5af190811561052c57600091611a80575b50438355348110611a52575b507f3d94fecedaa4f90b8bd459797adb95f5bb11426025c5541390d9ccc1ad1b60a19154604051908152a2005b60008080611a61819434612bdf565b818115611a77575b3390f11561052c5783611a25565b506108fc611a69565b90508181813d8311611aa6575b611a97818361291a565b8101031261016c575184611a19565b503d611a8d565b6064906040519062461bcd60e51b82526004820152601c60248201527f526166666c653a2072616e646f6d6e65737320726571756573746564000000006044820152fd5b3461016c57600036600319011261016c577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163003611b4a5760206040516000805160206131758339815191528152f35b60405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608490fd5b604036600319011261016c57611bc96128c0565b6024356001600160401b03811161016c573660238201121561016c57611bf9903690602481600401359101612956565b906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811690611c3230831415612b1d565b611c4f600080516020613175833981519152928284541614612b7e565b611c5e81609754163314612c04565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615611c96575050611c949150612e39565b005b6040516352d1902d60e01b81526020939291831691908481600481865afa60009181611e23575b50611d1e5760405162461bcd60e51b815260048101869052602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608490fd5b03611dcc57611d2c82612e39565b7fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2825115801590611dc4575b611d6257005b600080611c949460405194611d76866128ff565b602786527f416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c81870152660819985a5b195960ca1b604087015281519101845af4611dbe613070565b916130a0565b506001611d5c565b60405162461bcd60e51b815260048101849052602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608490fd5b9091508581813d8311611e4b575b611e3b818361291a565b8101031261016c57519087611cbd565b503d611e31565b3461016c5760208060031936011261016c57611e6c6128c0565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169290611ea530851415612b1d565b611ec2600080516020613175833981519152948286541614612b7e565b611ed181609754163314612c04565b60405193828501918583106001600160401b038411176109a857826040526000865260ff7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435416600014611f2d5750505050611c949150612e39565b84939416906040516352d1902d60e01b81528581600481865afa600091816120ae575b50611fb15760405162461bcd60e51b815260048101879052602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608490fd5b0361205757611fbf83612e39565b7fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a283511580159061204f575b611ff557005b60008091611c94957f416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c6040519661202b886128ff565b60278852870152660819985a5b195960ca1b60408701525190845af4611dbe613070565b506000611fef565b60405162461bcd60e51b815260048101859052602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608490fd5b9091508681813d83116120d6575b6120c6818361291a565b8101031261016c57519088611f50565b503d6120bc565b3461016c57604036600319011261016c576004356024359063ffffffff918281169283820361016c5782600052602090609e825261212160406000205415156129ca565b612129612cfa565b83600052609e825260406000209261214760ff600786015416612a80565b6001840154421015806123b0575b1561236b57600984019161216c8282855416612ac5565b818060038801541691161161232657612189876005870154612a55565b9460018060a01b03609954166040516370a0823160e01b81523360048201528681602481855afa801561052c5788916000916122f5575b50106122b057803b1561016c57604051632770a7eb60e21b815233600482015260248101979097526000908790604490829084905af195861561052c577f338e0cd33c4e120afcd73f43f082fd8940ed67ac35180d278d2eb4f3ed51d92e966122a1575b5060088101903360005281865282604060002054161561228d575b503360005284526040600020908154918161225c85828616612ac5565b1663ffffffff19809416179055612277845493828516612ac5565b1691161790556040519384523393a36001606555005b61229b906006339101612add565b8861223f565b6122aa906128ec565b88612224565b60405162461bcd60e51b815260048101879052601b60248201527f526166666c653a20696e73756666696369656e7420706f696e747300000000006044820152606490fd5b809250888092503d831161231f575b61230e818361291a565b8101031261016c578790518b6121c0565b503d612304565b60405162461bcd60e51b815260048101859052601b60248201527f526166666c653a206d6178207469636b657473207265616368656400000000006044820152606490fd5b60405162461bcd60e51b815260048101849052601860248201527f526166666c653a206e6f7420696e2074696d656672616d6500000000000000006044820152606490fd5b506002840154421115612155565b3461016c57600036600319011261016c57609b546040516001600160a01b039091168152602090f35b3461016c57600036600319011261016c576020609d54604051908152f35b3461016c5760208060031936011261016c57600435612422612cfa565b80600052609e825261243a60406000205415156129ca565b80600052609e8252604060002090600782019283549361245c60ff8616612a16565b60028401544211156125f55763ffffffff9060648260098701541602958287169687036111935760039683600388015416906014820291808304601414901517156111935710156125b85760ff1916905591926008810192906006810160005b815481101561258b576124cf8183612a68565b90546001600160a01b03918a1b1c811660008181528888526040902054919291861680612503575b505060019150016124bc565b600586015461251191612a55565b9260995416803b1561016c576040516340c10f1960e01b81526001600160a01b038316600482015260248101949094526000908490604490829084905af192831561052c5760019361257c575b50600052868652604060002063ffffffff19815416905589806124f7565b612585906128ec565b8a61255e565b867f2a7d48246875b5f17dc9944def25fc8fe90e524ca2165e290ffdc0e44a0bf8b6600080a26001606555005b60405162461bcd60e51b8152600481018590526015602482015274149859999b194e881d1a1c995cda1bdb19081b595d605a1b6044820152606490fd5b60405162461bcd60e51b8152600481018390526011602482015270149859999b194e881b9bdd08195b991959607a1b6044820152606490fd5b3461016c57600036600319011261016c57609a546040516001600160a01b039091168152602090f35b3461016c5760a036600319011261016c576126706128c0565b6126786128aa565b6001600160a01b03604435818116929083900361016c576126976128d6565b916084359281841680940361016c576000549460ff8660081c161595868097612851575b801561283a575b156127de5760ff198116600117600055866127cc575b5082600054976126ff60ff8a60081c166126f181612c9a565b6126fa81612c9a565b612c9a565b6001606555169384156127925783906bffffffffffffffffffffffff60a01b958087609954161760995586609c541617609c551684609a541617609a5583609b541617609b5516816098541617609855609754161760975561275d57005b61ff0019166000557f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498602060405160018152a1005b60405162461bcd60e51b8152602060048201526012602482015271696e76616c6964204d696e69506f696e747360701b6044820152606490fd5b61ffff191661010117600055876126d8565b60405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608490fd5b50303b1580156126c25750600160ff8216146126c2565b50600160ff8216106126bb565b3461016c57604036600319011261016c5760209061287a6128aa565b600435600052609e835260086040600020019060018060a01b0316600052825263ffffffff604060002054168152f35b602435906001600160a01b038216820361016c57565b600435906001600160a01b038216820361016c57565b606435906001600160a01b038216820361016c57565b6001600160401b0381116109a857604052565b606081019081106001600160401b038211176109a857604052565b90601f801991011681019081106001600160401b038211176109a857604052565b6001600160401b0381116109a857601f01601f191660200190565b9291926129628261293b565b91612970604051938461291a565b82948184528183011161016c578281602093846000960137010152565b90815180825260208080930193019160005b8281106129ad575050505090565b83516001600160a01b03168552938101939281019260010161299f565b156129d157565b60405162461bcd60e51b815260206004820152601c60248201527f526166666c653a20726f756e6420646f6573206e6f74206578697374000000006044820152606490fd5b15612a1d57565b60405162461bcd60e51b815260206004820152601060248201526f526166666c653a20696e61637469766560801b6044820152606490fd5b8181029291811591840414171561119357565b80548210156115925760005260206000200190600090565b15612a8757565b60405162461bcd60e51b8152602060048201526016602482015275149859999b194e881a5b9858dd1a5d99481c9bdd5b9960521b6044820152606490fd5b91909163ffffffff8080941691160191821161119357565b8054680100000000000000008110156109a857612aff91600182018155612a68565b60018060a09493941b038084549260031b9316831b921b1916179055565b15612b2457565b60405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b19195b1959d85d1958d85b1b60a21b6064820152608490fd5b15612b8557565b60405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b6163746976652070726f787960a01b6064820152608490fd5b9190820391821161119357565b9081602091031261016c5751801515810361016c5790565b15612c0b57565b60405162461bcd60e51b81526020600482015260116024820152702930b33336329d103737ba1037bbb732b960791b6044820152606490fd5b9190820180921161119357565b60001981146111935760010190565b90600182811c92168015612c90575b6020831014612c7a57565b634e487b7160e01b600052602260045260246000fd5b91607f1691612c6f565b15612ca157565b60405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608490fd5b600260655414612d0b576002606555565b60405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606490fd5b9081602091031261016c575163ffffffff8116810361016c5790565b6001600160401b0381116109a85760051b60200190565b8051156115925760200190565b8051600110156115925760400190565b8051600210156115925760600190565b80518210156115925760209160051b010190565b90612dce82612d6c565b612ddb604051918261291a565b8281528092612dec601f1991612d6c565b0190602036910137565b60405163a9059cbb60e01b60208201526001600160a01b03929092166024830152604480830193909352918152612e3791612e3260648361291a565b612f7f565b565b803b15612e6e5760008051602061317583398151915280546001600160a01b0319166001600160a01b03909216919091179055565b60405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608490fd5b9091600090815b600684018054841015612f415783612ee791612a68565b905460039190911b1c6001600160a01b0316600081815260088601602052604090205463ffffffff169190612f1c8383612c44565b8710612f375750600191612f2f91612c44565b920191612ed0565b9450505092505090565b60405162461bcd60e51b8152602060048201526016602482015275526166666c653a20696e646578206f766572666c6f7760501b6044820152606490fd5b60408051908101916001600160a01b03166001600160401b038311828410176109a857612fe8926040526000806020958685527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656487860152868151910182855af1611dbe613070565b805190828215928315613058575b505050156130015750565b6084906040519062461bcd60e51b82526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152fd5b6130689350820181019101612bec565b388281612ff6565b3d1561309b573d906130818261293b565b9161308f604051938461291a565b82523d6000602084013e565b606090565b9192901561310257508151156130b4575090565b3b156130bd5790565b60405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606490fd5b8251909150156131155750805190602001fd5b6040519062461bcd60e51b82528160208060048301528251908160248401526000935b82851061315b575050604492506000838284010152601f80199101168101030190fd5b848101820151868601604401529381019385935061313856fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca164736f6c6343000818000a","id":1,"type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"AkibaRaffleV3_Upgrade#akiba_impl_vNext","networkInteractionId":1,"nonce":8,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"AkibaRaffleV3_Upgrade#akiba_impl_vNext","networkInteractionId":1,"nonce":8,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"50001000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"1000000"}},"hash":"0x51b8149ffaf831fbdd2541e0da703ef8e702692dad68f5e8486d0f4425248952"},"type":"TRANSACTION_SEND"} +{"futureId":"AkibaRaffleV3_Upgrade#akiba_impl_vNext","hash":"0x51b8149ffaf831fbdd2541e0da703ef8e702692dad68f5e8486d0f4425248952","networkInteractionId":1,"receipt":{"blockHash":"0x0f67041a81f232ae58aaa68720831570864e00a89d6272e7a1d5f7d4534274d1","blockNumber":55942408,"contractAddress":"0xb533CB94DeaBDd37F870E47510a03539C413CEFF","logs":[],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"AkibaRaffleV3_Upgrade#akiba_impl_vNext","result":{"address":"0xb533CB94DeaBDd37F870E47510a03539C413CEFF","type":"SUCCESS"},"type":"DEPLOYMENT_EXECUTION_STATE_COMPLETE"} +{"args":["0xb533CB94DeaBDd37F870E47510a03539C413CEFF"],"artifactId":"AkibaRaffleV3_Upgrade#AkibaRaffleV3","contractAddress":"0x72fEFD4e943475c5cB7Cf11753fE60d04aEb7ff0","dependencies":["AkibaRaffleV3_Upgrade#AkibaRaffleV3","AkibaRaffleV3_Upgrade#akiba_impl_vNext"],"from":"0x03909bb1e9799336d4a8c49b74343c2a85fdad9d","functionName":"upgradeTo","futureId":"AkibaRaffleV3_Upgrade#akiba_upgrade_call","strategy":"basic","strategyConfig":{},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"AkibaRaffleV3_Upgrade#akiba_upgrade_call","networkInteraction":{"data":"0x3659cfe6000000000000000000000000b533cb94deabdd37f870e47510a03539c413ceff","id":1,"to":"0x72fEFD4e943475c5cB7Cf11753fE60d04aEb7ff0","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"AkibaRaffleV3_Upgrade#akiba_upgrade_call","networkInteractionId":1,"nonce":9,"type":"TRANSACTION_PREPARE_SEND"} +{"futureId":"AkibaRaffleV3_Upgrade#akiba_upgrade_call","networkInteractionId":1,"nonce":9,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"50001000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"1000000"}},"hash":"0x501065f8b02920b1453a25f351d4d7803a034cd1765eb7a6a352699c9454271c"},"type":"TRANSACTION_SEND"} +{"futureId":"AkibaRaffleV3_Upgrade#akiba_upgrade_call","hash":"0x501065f8b02920b1453a25f351d4d7803a034cd1765eb7a6a352699c9454271c","networkInteractionId":1,"receipt":{"blockHash":"0x50d5dd80c9dbacf817b76ab7d21b8c0a05743d8c498ebd3fe8897477504d1552","blockNumber":55942418,"logs":[{"address":"0x72fEFD4e943475c5cB7Cf11753fE60d04aEb7ff0","data":"0x","logIndex":1,"topics":["0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b","0x000000000000000000000000b533cb94deabdd37f870e47510a03539c413ceff"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"AkibaRaffleV3_Upgrade#akiba_upgrade_call","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"} \ No newline at end of file diff --git a/packages/hardhat/ignition/modules/MiniPay.ts b/packages/hardhat/ignition/modules/MiniPay.ts index 632b5c1..c47efa5 100644 --- a/packages/hardhat/ignition/modules/MiniPay.ts +++ b/packages/hardhat/ignition/modules/MiniPay.ts @@ -1,10 +1,10 @@ import { buildModule } from "@nomicfoundation/hardhat-ignition/modules"; -const RaffleModule = buildModule("vaultToken", (m) => { +const RaffleModule = buildModule("Physical", (m) => { // Initial numbers array to deploy the contract with const initialNumbers = [1, 2, 3, 4, 5]; // <-- you can change these - const raffle = m.contract("akUSDT") + const raffle = m.contract("PhysicalPrizeNFT", ["Akiba Prize", "AKIBA"]) return { raffle }; }); diff --git a/packages/hardhat/ignition/modules/MiniRaffle.ts b/packages/hardhat/ignition/modules/MiniRaffle.ts index cfd27f3..6bda7a8 100644 --- a/packages/hardhat/ignition/modules/MiniRaffle.ts +++ b/packages/hardhat/ignition/modules/MiniRaffle.ts @@ -1,12 +1,12 @@ import { buildModule } from "@nomicfoundation/hardhat-ignition/modules"; -const RaffleModule = buildModule("MiniRafflesForNiko", (m) => { +const RaffleModule = buildModule("points", (m) => { // Initial numbers array to deploy the contract with const initialNumbers = [1, 2, 3, 4, 5]; // <-- you can change these const cUSD = "0x765de816845861e75a25fca122bb6898b8b1282a"; const usdt = '0x48065fbBE25f71C9282ddf5e1cD6D6A887483D5e' const MiniPoints = '0xb0012Ff26b6eB4F75d09028233204635c0332050' - const raffle = m.contract("MiniRaffle",[MiniPoints, cUSD, usdt]) + const raffle = m.contract("AkibaMiles") return { raffle }; }); diff --git a/packages/hardhat/ignition/modules/proxyDeployer.ts b/packages/hardhat/ignition/modules/proxyDeployer.ts index 4782ba6..479e5e9 100644 --- a/packages/hardhat/ignition/modules/proxyDeployer.ts +++ b/packages/hardhat/ignition/modules/proxyDeployer.ts @@ -1,33 +1,34 @@ import { buildModule } from "@nomicfoundation/hardhat-ignition/modules"; import { ethers } from "ethers"; -const MiniRaffleModule = buildModule("MilesVault", (m) => { +const MiniRaffleModule = buildModule("AMilesV3", (m) => { /************* * CONFIG * *************/ // <<< fill in real addresses before running >>> + - const aCelUSDT = "0xDeE98402A302e4D707fB9bf2bac66fAEEc31e8Df"; + const minipoints = "0xd59AE111d976342ff58c6dE2B6f2b002415825C1"; const usdt = '0x48065fbBE25f71C9282ddf5e1cD6D6A887483D5e' - const vaultToken = '0x9eF834341C0aaE253206e838c37518d1E1927716' - const pool = '0x3E59A31363E2ad014dcbc521c4a0d5757d9f3402' - const safe = '0x9E621004591Fa0224182083D535ACBee90914e63' + const cUSD = '0x874069fa1eb16d44d622f2e0ca25eea172369bc1' + const owner = '0x03909bb1E9799336d4a8c49B74343C2a85fDad9d' + const prize = '0x8F60907f41593d4B41f5e0cEa48415cd61854a79' const referralCode = 0; /************* * 1. Deploy implementation *************/ - const implementation = m.contract("AkibaMilesVaultUUPS", [], { id: "akiba_impl" }); + const implementation = m.contract("AkibaRaffleV3", [], { id: "akiba_impl" }); /************* * 2. Encode initializer data *************/ const iface = new ethers.utils.Interface([ - "function initialize(address,address,address,address, address, uint16)" + "function initialize(address,address,address,address,address)" ]); const initData = iface.encodeFunctionData("initialize", [ - usdt, aCelUSDT, pool,vaultToken,safe,referralCode + minipoints, cUSD, usdt,prize,owner ]); /************* diff --git a/packages/hardhat/ignition/modules/upgrade.ts b/packages/hardhat/ignition/modules/upgrade.ts new file mode 100644 index 0000000..b0b77f5 --- /dev/null +++ b/packages/hardhat/ignition/modules/upgrade.ts @@ -0,0 +1,25 @@ +import { buildModule } from "@nomicfoundation/hardhat-ignition/modules"; + +/** + * Upgrades the existing UUPS proxy at PROXY_ADDR to a new AkibaRaffleV3 implementation. + * Make sure the deployer account is the contract owner (authorized to upgrade). + */ +const PROXY_ADDR = "0xd75dfa972c6136f1c594fec1945302f885e1ab29"; + +const AkibaRaffleV3_Upgrade = buildModule("AkibaRaffleV4_Upgrade", (m) => { + // 1) Deploy new implementation + const newImpl = m.contract("AkibaRaffleV4", [], { id: "akiba_impl_v4" }); + + // 2) Treat the existing proxy as AkibaRaffleV3 + const proxyAsAkiba = m.contractAt("AkibaRaffleV3", PROXY_ADDR); + + // 3) Call upgradeTo(newImpl) via the proxy + m.call(proxyAsAkiba, "upgradeTo", [newImpl], { + id: "akiba_upgrade_call", + after: [newImpl], + }); + + return { newImpl, proxyAsAkiba }; +}); + +export default AkibaRaffleV3_Upgrade; diff --git a/packages/hardhat/package.json b/packages/hardhat/package.json index 1ce81bb..80ebde3 100644 --- a/packages/hardhat/package.json +++ b/packages/hardhat/package.json @@ -9,7 +9,7 @@ "@nomicfoundation/hardhat-ignition-ethers": "^0.15.0", "@nomicfoundation/hardhat-network-helpers": "^1.0.11", "@nomicfoundation/hardhat-toolbox": "^5.0.0", - "@nomicfoundation/hardhat-verify": "^2.0.11", + "@nomicfoundation/hardhat-verify": "^2.1.3", "@nomicfoundation/ignition-core": "^0.15.5", "@nomiclabs/hardhat-ethers": "^2.2.3", "@openzeppelin/contracts": "^4.8.3", diff --git a/packages/hardhat/scripts/approve.js b/packages/hardhat/scripts/approve.js index bb04a8c..6ab7001 100644 --- a/packages/hardhat/scripts/approve.js +++ b/packages/hardhat/scripts/approve.js @@ -1,14 +1,15 @@ const ethers = require("ethers"); -const raffleAbi = require("../artifacts/contracts/MiniRaffle.sol/AkibaRaffle.json") +const raffleAbi = require("../artifacts/contracts/MiniRaffleV3.sol/AkibaRaffleV3.json") const milesAbi = require("../artifacts/contracts/MiniPoints.sol/AkibaMiles.json") require("dotenv").config(); // ─── ENV & CONSTANTS ────────────────────────────────────────────── -const RPC_URL = 'https://forno.celo.org'; // e.g. "https://sepolia.optimism.io" +const RPC_URL = 'https://alfajores-forno.celo-testnet.org/'; // e.g. "https://sepolia.optimism.io" const PRIVATE_KEY = process.env.PRIVATE_KEY; // console.log(PRIVATE_KEY) -const RAFFLE_ADDR = "0xD75dfa972C6136f1c594Fec1945302f885E1ab29"; -const cUSD = "0x765de816845861e75a25fca122bb6898b8b1282a"; -const MiniPoints = '0xEeD878017f027FE96316007D0ca5fDA58Ee93a6b' +const RAFFLE_ADDR = "0x72fEFD4e943475c5cB7Cf11753fE60d04aEb7ff0"; +const cUSD = "0x874069fa1eb16d44d622f2e0ca25eea172369bc1"; +const MiniPoints = '0xd59AE111d976342ff58c6dE2B6f2b002415825C1' +const prize="0x8F60907f41593d4B41f5e0cEa48415cd61854a79" // test‑net USDC const BENEFICIARY = ""; // replace @@ -27,18 +28,18 @@ const miles = new ethers.Contract(MiniPoints, milesAbi.abi, ownerSigner // ─── MAIN LOGIC ─────────────────────────────────────────────────── async function main() { - const allowRaffle = await miles.setMinter('0xF20a5e1a4ca28D64f2C4A90998A41E8045288F48', true); - await allowRaffle.wait() - console.log("Tx Hash: ", allowRaffle.hash) + // const allowRaffle = await miles.setMinter('0xF20a5e1a4ca28D64f2C4A90998A41E8045288F48', true); + // await allowRaffle.wait() + // console.log("Tx Hash: ", allowRaffle.hash) - const rewardPool = ethers.utils.parseUnits("10000", 18); // 100 USDC (6 dec) - const approveTx = await miles.approve(RAFFLE_ADDR, rewardPool); - await approveTx.wait(); - console.log(`✅ Approved ${ethers.utils.formatUnits(rewardPool,18 )} USDC`); +// const rewardPool = ethers.utils.parseUnits("10000", 18); // 100 USDC (6 dec) +// const approveTx = await miles.approve(RAFFLE_ADDR, rewardPool); +// await approveTx.wait(); +// console.log(`✅ Approved ${ethers.utils.formatUnits(rewardPool,18 )} USDC`); // // // 2. compute startTime = now + 5 minutes const latest = await provider.getBlock("latest"); - const startTime = BigInt(latest.timestamp) + 300n; // 300 s = 5 min + const startTime = BigInt(latest.timestamp) + 30n; // 300 s = 5 min // const vrfFee = ethers.utils.parseEther("0.01"); @@ -57,16 +58,24 @@ async function main() { // // 3. create the round - const tx = await raffle.createRaffleRound( - startTime, // _startTime - 2592000, // _duration (1 week) - 300, // _maxTickets - MiniPoints, // _token - ethers.utils.parseEther('200'), // _rewardpool - ethers.utils.parseUnits("5", 18), // _ticketCostPoints (50 MiniPoints) // _beneficiary - ); - await tx.wait(); - console.log("🎉 Round created in tx:", tx.hash); + // const tx = await raffle.createRaffleRound( + // startTime, // _startTime + // 2592000, // _duration (1 week) + // 30, // _maxTickets + // prize, + // 3, // _token + // 0, // _rewardpool + // ethers.utils.parseUnits("5", 18), + // "ipfs://bafybeidajb6cphtnmofomkdwfas3smvu63msti4pleb4uylpwgwdctn5qe" + // // _ticketCostPoints (50 MiniPoints) // _beneficiary + // ); + // await tx.wait(); + // console.log("🎉 Round created in tx:", tx.hash); + + const tx = await raffle.drawWinner(1) + await tx.wait(); + console.log("🎉 Round created in tx:", tx.hash); + diff --git a/packages/hardhat/scripts/upgrade.ts b/packages/hardhat/scripts/upgrade.ts index f2650d4..7f1455d 100644 --- a/packages/hardhat/scripts/upgrade.ts +++ b/packages/hardhat/scripts/upgrade.ts @@ -1,7 +1,7 @@ import { ethers } from "hardhat"; async function upgrade() { - const proxyAddress = "0xD75dfa972C6136f1c594Fec1945302f885E1ab29"; + const proxyAddress = "0x72fEFD4e943475c5cB7Cf11753fE60d04aEb7ff0"; const newImplementation = "0x1A73B6603ae2944F8683624D052d951Bd608D80b"; // deployed via Ignition const [deployer] = await ethers.getSigners(); diff --git a/packages/react-app/app/earn/page.tsx b/packages/react-app/app/earn/page.tsx index b84d20c..519f39f 100644 --- a/packages/react-app/app/earn/page.tsx +++ b/packages/react-app/app/earn/page.tsx @@ -7,27 +7,86 @@ import EarnPartnerQuestSheet from "@/components/earn-partner-quest-sheet"; import SuccessModal from "@/components/success-modal"; import { Tabs, TabsList, TabsTrigger, TabsContent } from "@/components/ui/tabs"; import { useWeb3 } from "@/contexts/useWeb3"; -import React, { useEffect, useState } from "react"; +import React, { useEffect, useMemo, useState } from "react"; +import { USDT } from "@/lib/svg"; +import Image from "next/image"; +import { Sheet, SheetClose, SheetContent, SheetFooter } from "@/components/ui/sheet"; +import { ArrowDown, ArrowUp, Download, Gift, Question } from "@phosphor-icons/react"; +import { Button } from "@/components/ui/button"; +import { useRouter } from "next/navigation"; +import { formatUnits } from "viem"; export default function EarnPage() { - const { address, getUserAddress, getakibaMilesBalance } = useWeb3(); + // ✅ one call + const web3 = useWeb3() as any; + const { address, getUserAddress, getakibaMilesBalance, getUserVaultBalance } = web3; + const [balance, setBalance] = useState("0"); const [sheetOpen, setSheetOpen] = useState(false); + const [vaultHelp, setVaultHelp] = useState(false); + const [currentDeposit, setCurrentDeposit] = useState(0); const [quest, setQuest] = useState(null); const [success, setSuccess] = useState(false); + const [vaultDeposit, setVaultDeposit] = useState(0); + const [vaultMilesEarned, setVaultMilesEarned] = useState(null); + const [vaultMilesLoading, setVaultMilesLoading] = useState(false); + + + const router = useRouter(); + + + useEffect(() => { + let aborted = false; + const load = async () => { + if (!address) return; + setVaultMilesLoading(true); + try { + const base = process.env.NEXT_PUBLIC_REWARDS_URL!; + const res = await fetch(`${base}/vault/earned/${address}`, { cache: 'no-store' }); + if (!res.ok) throw new Error(await res.text()); + const { earnedWei } = await res.json(); + const pretty = Number(formatUnits(BigInt(earnedWei ?? '0'), 18)) + .toLocaleString(undefined, { maximumFractionDigits: 4 }); + if (!aborted) setVaultMilesEarned(pretty); + } catch { + if (!aborted) setVaultMilesEarned(null); + } finally { + if (!aborted) setVaultMilesLoading(false); + } + }; + load(); + return () => { aborted = true; }; + }, [address, success]); + + useEffect(() => { getUserAddress?.(); }, [getUserAddress]); + useEffect(() => { + const fetchBalance = async () => { + if (!address) return; + try { + const balance = await getUserVaultBalance(); + setCurrentDeposit(balance); // ← number + } catch (e) { console.log(e); } + }; + fetchBalance(); + }, [address, getUserVaultBalance]); - /* wallet + balance */ - useEffect(() => { getUserAddress(); }, [getUserAddress]); useEffect(() => { if (!address) return; (async () => { - const b = await getakibaMilesBalance(); - setBalance(b); + const b = await getakibaMilesBalance?.(); + if (b != null) setBalance(b); + + const d = await web3?.getVaultDeposit?.().catch(() => null); + if (d != null) setVaultDeposit(Number(d)); })(); - }, [address, getakibaMilesBalance]); + }, [address, getakibaMilesBalance, web3]); const openQuest = (q: any) => { setQuest(q); setSheetOpen(true); }; + const goDeposit = () => router.push("/vaults"); + const goWithdraw = () => router.push("/vaults/withdraw"); + const hasDeposit = currentDeposit > 0; + return (
@@ -35,8 +94,97 @@ export default function EarnPage() {

Complete challenges to earn AkibaMiles.

- {/* ── Page-level Active / Completed tabs ───────────── */} - + +
+
+
+

Akiba Vault

+ setVaultHelp(true)} /> +
+

Deposit USDT to earn akibaMiles daily.

+
+ +
+
+

My Deposit(USDT)

+
+ +

{currentDeposit}

+
+ {hasDeposit && ( +

+ {vaultMilesLoading ? '…' : (vaultMilesEarned ?? '0')} AkibaMiles earned +

+ )} +
+
+
+
+ + + +
+
+ +
+
+

Deposit USDT

+

Deposit USDT into the Akiba Vault and earn 1 AkibaMile per day for every 1 USDT you hold.

+
+
+
+
+ +
+
+

Earn Rewards

+

AkibaMiles are automatically added to your balance during the daily payout every 24 hours. + 0.00

+
+
+
+
+ +
+
+

Withdraw Anytime

+

You can withdraw anytime and your miles are yours to keep.

+
+
+ + +
+ + {/* Tabs */} + +
+

Daily challenges

+

Completed a challenge? Click & claim Miles

+
- {/* ── ACTIVE tab ─────────────────────────── */} - {/* Daily (active only) */} -
-

Daily challenges

-

Completed a challenge? Click & claim Miles

-
- - - + + { setQuest(q); setSheetOpen(true); }} />
- {/* ── COMPLETED tab ──────────────────────── */}

Completed today

- {/* reuse DailyChallenges with flag */} - - - {/* partner quests don’t yet track completion — - if/when you store partner_engagements, you can - add a PartnerQuestsCompleted component here */} +
diff --git a/packages/react-app/app/vaults/page.tsx b/packages/react-app/app/vaults/page.tsx new file mode 100644 index 0000000..b244e5b --- /dev/null +++ b/packages/react-app/app/vaults/page.tsx @@ -0,0 +1,241 @@ +"use client"; + +import Image from "next/image"; +import { useRouter } from "next/navigation"; +import React, { useEffect, useMemo, useState } from "react"; +import { XCircleIcon } from "lucide-react"; +import { USDT } from "@/lib/svg"; +import { useWeb3 } from "@/contexts/useWeb3"; +import { Button } from "@/components/ui/button"; + +const VaultPage = () => { + const router = useRouter(); + + // ✅ Call the hook once, at top-level + const web3 = useWeb3() as any; + const { address, getUserAddress, getakibaMilesBalance, getUSDTBalance,getUserVaultBalance, approveVault, deposit, hasAllowance } = web3; + + // balances + const [available, setAvailable] = useState(0); + const [currentDeposit, setCurrentDeposit] = useState(0); + // input + state + const [amount, setAmount] = useState(""); + const [approved, setApproved] = useState(false); + const [loadingApprove, setLoadingApprove] = useState(false); + const [loadingDeposit, setLoadingDeposit] = useState(false); + const [successOpen, setSuccessOpen] = useState(false); + const [txHash, setTxHash] = useState(null); + + const numericAmount = useMemo( + () => (amount ? Math.max(0, Number(amount)) : 0), + [amount] + ); + const minOK = numericAmount >= 1; + const withinBal = numericAmount <= available; + + useEffect(() => { getUserAddress?.(); }, [getUserAddress]); + + useEffect(() => { + let cancelled = false; + (async () => { + // Only check when user has typed a valid minimum amount + if (!address || !minOK) { + if (!cancelled) setApproved(false); + return; + } + try { + const ok = await hasAllowance(String(numericAmount)); + if (!cancelled) setApproved(ok); + } catch { + if (!cancelled) setApproved(false); + } + })(); + return () => { cancelled = true; }; + }, [address, minOK, numericAmount, hasAllowance]); + + + useEffect(() => { + const fetchBalance = async () => { + if (!address) return; + try { + const balance = await getUSDTBalance(); + setAvailable(balance); // ← number + } catch (e) { console.log(e); } + }; + fetchBalance(); + }, [address, getUSDTBalance]); + + useEffect(() => { + const fetchBalance = async () => { + if (!address) return; + try { + const balance = await getUserVaultBalance(); + setCurrentDeposit(balance); // ← number + } catch (e) { console.log(e); } + }; + fetchBalance(); + }, [address, getUserVaultBalance]); + + const setMax = () => setAmount(String(available || 0)); + + const onChangeAmount = (v: string) => { + const clean = v.replace(/[^\d.]/g, ""); + const parts = clean.split("."); + const safe = + parts.length > 2 ? `${parts[0]}.${parts.slice(1).join("")}` : clean; + setAmount(safe); + }; + + const handleApprove = async () => { + if (!minOK || !withinBal || approved) return; + setLoadingApprove(true); + try { + const { hash, receipt } = await approveVault(String(numericAmount)); + setTxHash(hash); // ← use returned hash + setApproved(true); // (or re-check via hasAllowance) + } catch (e) { + console.error(e); + setApproved(false); + } finally { + setLoadingApprove(false); + } + }; + + const handleDeposit = async () => { + if (!approved || !minOK || !withinBal) return; + setLoadingDeposit(true); + try { + const { hash } = await deposit(String(numericAmount)); // ← correct fn name + setTxHash(hash); + + // optimistic update + setAvailable((b) => Math.max(0, b - numericAmount)); + setCurrentDeposit((d) => d + numericAmount); + + setSuccessOpen(true); + await getakibaMilesBalance?.().catch(() => {}); + } catch (e) { + console.error(e); + } finally { + setLoadingDeposit(false); + } + }; + + const closeSuccess = () => { + setSuccessOpen(false); + router.push("/earn"); + }; + + return ( +
+
+
+

Deposit into Vault

+ +
+

Earn 1 AkibaMile per day for every 1 USDT you deposit. Rewards are sent to your balance every 24 hours.

+
+ +
+

My Deposit(USDT)

+
+ +

{currentDeposit}

+
+
+ +
+

New Deposit(USDT)

+
+
+ + onChangeAmount(e.target.value)} + placeholder="0.00" + inputMode="decimal" + className="mx-2 w-full outline-none" + /> +
+
+

Available:

+
+

{available}

+ +
+
+ + {!minOK && amount && ( +

Min. deposit is 1 USDT

+ )} + {!withinBal && ( +

Insufficient balance

+ )} +
+
+ + {!approved ? ( +
+ ); +}; + +export default VaultPage; diff --git a/packages/react-app/app/vaults/withdraw/page.tsx b/packages/react-app/app/vaults/withdraw/page.tsx new file mode 100644 index 0000000..57ec8f3 --- /dev/null +++ b/packages/react-app/app/vaults/withdraw/page.tsx @@ -0,0 +1,184 @@ +"use client"; + +import Image from "next/image"; +import { useRouter } from "next/navigation"; +import React, { useEffect, useMemo, useState } from "react"; +import { XCircleIcon } from "lucide-react"; +import { USDT } from "@/lib/svg"; +import { useWeb3 } from "@/contexts/useWeb3"; +import { Button } from "@/components/ui/button"; + +const WithdrawPage = () => { + const router = useRouter(); + + // ✅ Call once + const web3 = useWeb3() as any; + const { address, getUserAddress, getUserVaultBalance, withdraw } = web3; + + const [currentDeposit, setCurrentDeposit] = useState(0); + const [amount, setAmount] = useState(""); + const [loadingWithdraw, setLoadingWithdraw] = useState(false); + const [successOpen, setSuccessOpen] = useState(false); + const [txHash, setTxHash] = useState(null); + + const numericAmount = useMemo( + () => (amount ? Math.max(0, Number(amount)) : 0), + [amount] + ); + const withinDeposit = numericAmount > 0 && numericAmount <= currentDeposit; + + useEffect(() => { getUserAddress?.(); }, [getUserAddress]); + + + useEffect(() => { + const fetchBalance = async () => { + if (!address) return; + try { + const balance = await getUserVaultBalance(); + setCurrentDeposit(balance); // ← number + } catch (e) { console.log(e); } + }; + fetchBalance(); + }, [address, getUserVaultBalance]); + + useEffect(() => { + if (!address) return; + (async () => { + const dep = await web3?.getVaultDeposit?.().catch(() => null); + if (dep != null) setCurrentDeposit(Number(dep)); + })(); + }, [address, web3]); + + const setMax = () => setAmount(String(currentDeposit || 0)); + + const onChangeAmount = (v: string) => { + const clean = v.replace(/[^\d.]/g, ""); + const parts = clean.split("."); + const safe = + parts.length > 2 ? `${parts[0]}.${parts.slice(1).join("")}` : clean; + setAmount(safe); + }; + + const handleWithdraw = async () => { + if (!withinDeposit) return; + setLoadingWithdraw(true); + try { + const res = await withdraw(String(numericAmount)); + if (res?.txHash) setTxHash(res.txHash); + + setCurrentDeposit((d) => Math.max(0, d - numericAmount)); + setSuccessOpen(true); + } catch (e) { + console.error(e); + } finally { + setLoadingWithdraw(false); + } + }; + + const closeSuccess = () => { + setSuccessOpen(false); + router.push("/earn"); + }; + + return ( +
+
+
+

Withdraw from Vault

+ +
+

Withdraw any amount from your vault.

+
+ +
+

My Deposit(USDT)

+
+ +

{currentDeposit}

+
+
+ +
+

New Withdrawal(USDT)

+
+
+ + onChangeAmount(e.target.value)} + placeholder="0.00" + inputMode="decimal" + className="mx-2 w-full outline-none" + /> +
+
+

Available:

+
+

{currentDeposit}

+ +
+
+
+
+ + {loadingWithdraw ? ( +

+ Almost there, just tying up a few digital knots… +

+ ) : ( +
+ )} + +
+ + + )} +
+ ); +}; + +export default WithdrawPage; diff --git a/packages/react-app/components/Header.tsx b/packages/react-app/components/Header.tsx index d33530a..accf7fc 100644 --- a/packages/react-app/components/Header.tsx +++ b/packages/react-app/components/Header.tsx @@ -11,12 +11,12 @@ export default function Header() { const [hideConnectBtn, setHideConnectBtn] = useState(false); const { connect } = useConnect(); - useEffect(() => { - if (window.ethereum && window.ethereum.isMiniPay) { - setHideConnectBtn(true); - connect({ connector: injected({ target: "metaMask" }) }); - } - }, []); + // useEffect(() => { + // if (window.ethereum && window.ethereum.isMiniPay) { + // setHideConnectBtn(true); + // connect({ connector: injected({ target: "metaMask" }) }); + // } + // }, []); return ( diff --git a/packages/react-app/components/Layout.tsx b/packages/react-app/components/Layout.tsx index 0e2c2b4..97e3e50 100644 --- a/packages/react-app/components/Layout.tsx +++ b/packages/react-app/components/Layout.tsx @@ -14,13 +14,13 @@ const Layout: FC = ({ children }) => { const pathname = usePathname(); const { getUserAddress } = useWeb3(); - /* MiniPay detection */ - const [isMiniPay, setIsMiniPay] = useState(false); - useEffect(() => { - if (typeof window !== 'undefined' && (window as any).ethereum?.isMiniPay) { - setIsMiniPay(true); - } - }, []); + // /* MiniPay detection */ + // const [isMiniPay, setIsMiniPay] = useState(true); + // useEffect(() => { + // if (typeof window !== 'undefined' && (window as any).ethereum?.isMiniPay) { + // setIsMiniPay(true); + // } + // }, []); /* load wallet */ useEffect(() => { getUserAddress(); }, [getUserAddress]); @@ -33,19 +33,19 @@ const Layout: FC = ({ children }) => { const isClaim = pathname.startsWith('/claim'); /* redirect if new user */ - useEffect(() => { - if (!isFetched) return; - if (!isMember && !isOnboarding && !isClaim) { - router.replace('/onboarding'); - } - }, [isMember, isFetched, isOnboarding, isClaim, router]); + // useEffect(() => { + // if (!isFetched) return; + // if (!isMember && !isOnboarding && !isClaim) { + // router.replace('/onboarding'); + // } + // }, [isMember, isFetched, isOnboarding, isClaim, router]); /* wait for flag */ if (!isFetched) return null; return (
- {!isOnboarding && !isClaim && !isMiniPay &&
} + {/* {!isOnboarding && !isClaim && !isMiniPay &&
} */}
{children} diff --git a/packages/react-app/components/daily-challenge.tsx b/packages/react-app/components/daily-challenge.tsx index 457bf25..26b1df3 100644 --- a/packages/react-app/components/daily-challenge.tsx +++ b/packages/react-app/components/daily-challenge.tsx @@ -89,7 +89,7 @@ const ACTION_BY_ID: Record = { }; /* ────────────────────────────────────────────────────────── */ -export default function DailyChallenges({ showCompleted = false }: { showCompleted?: boolean }) { +export default function DailyChallenges({ showCompleted }: { showCompleted?: boolean }) { const { address, getUserAddress } = useWeb3(); const [active, setActive] = useState([]); diff --git a/packages/react-app/components/earn-partner-quest-sheet.tsx b/packages/react-app/components/earn-partner-quest-sheet.tsx index 2a5099b..e05f1a3 100644 --- a/packages/react-app/components/earn-partner-quest-sheet.tsx +++ b/packages/react-app/components/earn-partner-quest-sheet.tsx @@ -33,25 +33,25 @@ const handleClaim = async () => { return; } - /* ---------- decide how to open the partner app ---------- */ - const isMiniPay = typeof window !== "undefined" && (window as any).ethereum?.isMiniPay; + // /* ---------- decide how to open the partner app ---------- */ + // const isMiniPay = typeof window !== "undefined" && (window as any).ethereum?.isMiniPay; - // Build a deep-link for Twitter quests - let destination = quest.actionLink; - if (quest.title.toLowerCase().includes("twitter")) { - // open the Twitter app if installed, else fall back to web - destination = isMiniPay - ? "twitter://user?screen_name=akibaMilesApp" - : "https://twitter.com/akibaMilesApp"; - } + // // Build a deep-link for Twitter quests + // let destination = quest.actionLink; + // if (quest.title.toLowerCase().includes("twitter")) { + // // open the Twitter app if installed, else fall back to web + // destination = isMiniPay + // ? "twitter://user?screen_name=akibaMilesApp" + // : "https://twitter.com/akibaMilesApp"; + // } - if (isMiniPay) { - // leave MiniPay completely (opens external browser / app) - window.location.href = destination; - } else { - // normal browsers → new tab - window.open(destination, "_blank", "noopener,noreferrer"); - } + // if (isMiniPay) { + // // leave MiniPay completely (opens external browser / app) + // window.location.href = destination; + // } else { + // // normal browsers → new tab + // window.open(destination, "_blank", "noopener,noreferrer"); + // } /* ---------- mint later (same as before) ---------- */ setLoading(true); diff --git a/packages/react-app/contexts/useWeb3.ts b/packages/react-app/contexts/useWeb3.ts index aabf6de..e6e6f86 100644 --- a/packages/react-app/contexts/useWeb3.ts +++ b/packages/react-app/contexts/useWeb3.ts @@ -10,17 +10,24 @@ import { http, parseEther, formatUnits, + parseUnits, + erc20Abi } from "viem"; import { celo } from "viem/chains"; import StableTokenABI from "@/contexts/cusd-abi.json"; import MiniMilesAbi from "@/contexts/minimiles.json"; import raffleAbi from "@/contexts/miniraffle.json"; +import vaultAbi from "./vault.json" import posthog from "posthog-js"; export function useWeb3() { - const [address, setAddress] = useState(null); + const [address, setAddress] = useState(null); const [walletClient, setWalletClient] = useState(null); + const USDT_ADDRESS = process.env.USDT_ADDRESS || '0x48065fbBE25f71C9282ddf5e1cD6D6A887483D5e' + const akUSDT = '0x9eF834341C0aaE253206e838c37518d1E1927716' + const vault = '0xe44326FA2ea736A4c973Fa98892d0487246e8D2D' + // 1️⃣ instantiate once on mount useEffect(() => { if (typeof window === "undefined" || !window.ethereum) return; @@ -36,16 +43,16 @@ export function useWeb3() { const getUserAddress = async () => { if (typeof window !== "undefined" && window.ethereum) { - let walletClient = createWalletClient({ - transport: custom(window.ethereum), - chain: celo, - }); - - let [address] = await walletClient.getAddresses(); - setAddress(address); - posthog.identify(address) + let walletClient = createWalletClient({ + transport: custom(window.ethereum), + chain: celo, + }); + + let [address] = await walletClient.getAddresses(); + setAddress(address); + posthog.identify(address) } -}; + }; const publicClient = createPublicClient({ chain: celo, @@ -80,28 +87,144 @@ export function useWeb3() { [walletClient, address, publicClient] ); - // in src/contexts/useWeb3.ts - // 2️⃣ joinRaffle writes directly - const joinRaffle = useCallback( - async (roundId: number, ticketCount: number) => { - if (!walletClient || !address) throw new Error("Wallet not connected"); - - const hash = await walletClient.writeContract({ - address: '0xD75dfa972C6136f1c594Fec1945302f885E1ab29', - abi: raffleAbi.abi, - functionName: "joinRaffle", - account: address, - args: [BigInt(roundId), BigInt(ticketCount)] + // in src/contexts/useWeb3.ts + // 2️⃣ joinRaffle writes directly + const joinRaffle = useCallback( + async (roundId: number, ticketCount: number) => { + if (!walletClient || !address) throw new Error("Wallet not connected"); + + const hash = await walletClient.writeContract({ + address: '0xD75dfa972C6136f1c594Fec1945302f885E1ab29', + abi: raffleAbi.abi, + functionName: "joinRaffle", + account: address, + args: [BigInt(roundId), BigInt(ticketCount)] + }); + + // wait until it’s mined (optional-but-nice UX) + await publicClient.waitForTransactionReceipt({ hash }); + + return hash; // <- RETURN THE HASH STRING + }, + [walletClient, address, publicClient] + ); + + const getUSDTBalance = useCallback(async () => { + if (!address) throw new Error("Wallet not connected"); + const usdt_contract = getContract({ + abi: erc20Abi, + address: USDT_ADDRESS as `0x${string}` , + client: publicClient, }); + const raw: bigint = await usdt_contract.read.balanceOf([address as `0x${string}`]) as bigint; + const balance = formatUnits(raw, 6) + return Number(balance).toFixed(2); + }, [address, publicClient]); + + + const getUserVaultBalance = useCallback(async () => { + if (!address) throw new Error("Wallet not connected"); + const usdt_contract = getContract({ + abi: erc20Abi, + address: akUSDT as `0x${string}` , + client: publicClient, + }); + const raw: bigint = await usdt_contract.read.balanceOf([address as `0x${string}`]) as bigint; + const balance = formatUnits(raw, 6) + return Number(balance).toFixed(2); + }, [address, publicClient]); + + + const approveVault = useCallback( + async (amount: string) => { + if (!walletClient || !address) throw new Error("Wallet not ready"); + const tx = await walletClient.writeContract({ + address: USDT_ADDRESS, + abi: erc20Abi, + functionName: "approve", + account: address, + args: [vault, parseUnits(amount, 6)], + }); + return publicClient.waitForTransactionReceipt({ hash: tx }); + }, + [walletClient, address, publicClient] + ); - // wait until it’s mined (optional-but-nice UX) - await publicClient.waitForTransactionReceipt({ hash }); + const deposit = useCallback( + async (amount: string) => { + if (!walletClient || !address) throw new Error("Wallet not ready"); + + // (Optional) preflight: surface revert reasons before user signs + await publicClient.simulateContract({ + address: vault as `0x${string}`, + abi: vaultAbi, + functionName: "deposit", + account: address as `0x${string}`, + args: [parseUnits(amount, 6)], // USDT = 6 + }); + + const hash = await walletClient.writeContract({ + address: vault as `0x${string}`, + abi: vaultAbi, + functionName: "deposit", + account: address, + args: [parseUnits(amount, 6)], + }); + + const receipt = await publicClient.waitForTransactionReceipt({ + hash, + confirmations: 1, // wait at least 1 conf + }); + + return { hash, receipt }; + }, + [walletClient, address, publicClient] + ); - return hash; // <- RETURN THE HASH STRING - }, - [walletClient, address, publicClient] -); + const withdraw = useCallback( + async (amount: string) => { + if (!walletClient || !address) throw new Error("Wallet not ready"); + + // (Optional) preflight: surface revert reasons before user signs + await publicClient.simulateContract({ + address: vault as `0x${string}`, + abi: vaultAbi, + functionName: "withdraw", + account: address as `0x${string}`, + args: [parseUnits(amount, 6)], // USDT = 6 + }); + const hash = await walletClient.writeContract({ + address: vault as `0x${string}`, + abi: vaultAbi, + functionName: "withdraw", + account: address, + args: [parseUnits(amount, 6)], + }); + + const receipt = await publicClient.waitForTransactionReceipt({ + hash, + confirmations: 1, // wait at least 1 conf + }); + + return { hash, receipt }; + }, + [walletClient, address, publicClient] + ); + + const hasAllowance = useCallback(async (amount: string) => { + if (!address) return false; + const usdt = getContract({ + abi: erc20Abi, + address: USDT_ADDRESS as `0x${string}`, + client: publicClient, + }); + const raw = await usdt.read.allowance([address as `0x${string}`, vault as `0x${string}`]) as bigint; + return raw >= parseUnits(amount || "0", 6); + }, [address, publicClient]); + + + return { address, @@ -109,5 +232,11 @@ export function useWeb3() { getUserAddress, sendCUSD, joinRaffle, + getUSDTBalance, + getUserVaultBalance, + approveVault, + deposit, + hasAllowance, + withdraw }; } diff --git a/packages/react-app/contexts/vault.json b/packages/react-app/contexts/vault.json new file mode 100644 index 0000000..39a7454 --- /dev/null +++ b/packages/react-app/contexts/vault.json @@ -0,0 +1,454 @@ +[ + { + "inputs": [], + "name": "InsufficientReceipts", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "needed", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "current", + "type": "uint256" + } + ], + "name": "SafeATokenAllowanceTooLow", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "needed", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "current", + "type": "uint256" + } + ], + "name": "SafeATokenBalanceTooLow", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroAmount", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "previousAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "AdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "beacon", + "type": "address" + } + ], + "name": "BeaconUpgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Deposited", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "Initialized", + "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" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Paused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Unpaused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Withdrawn", + "type": "event" + }, + { + "inputs": [], + "name": "aToken", + "outputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "aavePool", + "outputs": [ + { + "internalType": "contract IAaveV3Pool", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "akToken", + "outputs": [ + { + "internalType": "contract IakUSDT", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "asset", + "outputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "deposit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_asset", + "type": "address" + }, + { + "internalType": "address", + "name": "_aToken", + "type": "address" + }, + { + "internalType": "address", + "name": "_aavePool", + "type": "address" + }, + { + "internalType": "address", + "name": "_vaultToken", + "type": "address" + }, + { + "internalType": "address", + "name": "_safe", + "type": "address" + }, + { + "internalType": "uint16", + "name": "_referralCode", + "type": "uint16" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "paused", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "proxiableUUID", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "referralCode", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "rescueToken", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "safe", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "unpause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + } + ], + "name": "upgradeTo", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "upgradeToAndCall", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "withdraw", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } +] \ No newline at end of file diff --git a/packages/react-app/lib/svg.ts b/packages/react-app/lib/svg.ts index 4e0c4be..1be5afb 100644 --- a/packages/react-app/lib/svg.ts +++ b/packages/react-app/lib/svg.ts @@ -28,6 +28,7 @@ import CusdRaffleSvg from "../public/svg/cusd-cash-raffle.svg" import MilesRaffleSvg from "../public/svg/miles-cash-raffle.svg" import W3MLogo from '../public/img/socials.jpg' import SYR from '../public/svg/SYR.svg' +import USDT from "../public/svg/usdt.svg" export { @@ -60,5 +61,6 @@ export { CusdRaffleSvg, MilesRaffleSvg, W3MLogo, - SYR + SYR, + USDT, } \ No newline at end of file diff --git a/packages/react-app/public/svg/usdt.svg b/packages/react-app/public/svg/usdt.svg new file mode 100644 index 0000000..d937acd --- /dev/null +++ b/packages/react-app/public/svg/usdt.svg @@ -0,0 +1,4 @@ + + + + diff --git a/packages/react-app/styles/globals.css b/packages/react-app/styles/globals.css index 67710c9..bfade60 100644 --- a/packages/react-app/styles/globals.css +++ b/packages/react-app/styles/globals.css @@ -1,6 +1,5 @@ @import url("https://fonts.googleapis.com/css2?family=DM+Sans:opsz,wght@9..40,300;9..40,400;9..40,500;9..40,600&family=Poppins&display=swap"); - @tailwind base; @tailwind components; @tailwind utilities;