Transactions
Token Transfers
Tokens
Internal Transactions
Coin Balance History
Logs
Code
Read Contract
Write Contract
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
- Contract name:
- GemJoin
- Optimization enabled
- true
- Compiler version
- v0.6.12+commit.27d51765
- Optimization runs
- 200
- EVM Version
- default
- Verified at
- 2025-04-18T13:57:40.892283Z
Constructor Arguments
0x00000000000000000000000016ca93f2f65d5495c874109fff38d11d39850b6757504c532d410000000000000000000000000000000000000000000000000000000000000000000000000000a1077a294dde1b09bb078844df40758a5d0f9a27
Arg [0] (address) : 0x16ca93f2f65d5495c874109fff38d11d39850b67
Arg [1] (bytes32) : 57504c532d410000000000000000000000000000000000000000000000000000
Arg [2] (address) : 0xa1077a294dde1b09bb078844df40758a5d0f9a27
Contract source code
// SPDX-License-Identifier: AGPL-3.0-or-later
/// join.sol -- Basic token adapters
pragma solidity ^0.6.12;
interface GemLike {
function decimals() external view returns (uint);
function transfer(address,uint) external returns (bool);
function transferFrom(address,address,uint) external returns (bool);
}
interface DSTokenLike {
function mint(address,uint) external;
function burn(address,uint) external;
}
interface VatLike {
function slip(bytes32,address,int) external;
function move(address,address,uint) external;
}
contract GemJoin {
// --- Auth ---
mapping (address => uint) public wards;
function rely(address usr) external auth {
wards[usr] = 1;
emit Rely(usr);
}
function deny(address usr) external auth {
wards[usr] = 0;
emit Deny(usr);
}
modifier auth {
require(wards[msg.sender] == 1, "GemJoin/not-authorized");
_;
}
VatLike public vat; // CDP Engine
bytes32 public ilk; // Collateral Type
GemLike public gem;
uint public dec;
uint public live; // Active Flag
// Events
event Rely(address indexed usr);
event Deny(address indexed usr);
event Join(address indexed usr, uint256 wad);
event Exit(address indexed usr, uint256 wad);
event Cage();
constructor(address vat_, bytes32 ilk_, address gem_) public {
wards[msg.sender] = 1;
live = 1;
vat = VatLike(vat_);
ilk = ilk_;
gem = GemLike(gem_);
dec = gem.decimals();
emit Rely(msg.sender);
}
function cage() external auth {
live = 0;
emit Cage();
}
function join(address usr, uint wad) external {
require(live == 1, "GemJoin/not-live");
require(int(wad) >= 0, "GemJoin/overflow");
vat.slip(ilk, usr, int(wad));
require(gem.transferFrom(msg.sender, address(this), wad), "GemJoin/failed-transfer");
emit Join(usr, wad);
}
function exit(address usr, uint wad) external {
require(live == 1, "GemJoin/not-live"); // Added live check
require(wad <= 2 ** 255, "GemJoin/overflow");
vat.slip(ilk, msg.sender, -int(wad));
require(gem.transfer(usr, wad), "GemJoin/failed-transfer");
emit Exit(usr, wad);
}
}
contract DaiJoin {
// --- Auth ---
mapping (address => uint) public wards;
function rely(address usr) external auth {
wards[usr] = 1;
emit Rely(usr);
}
function deny(address usr) external auth {
wards[usr] = 0;
emit Deny(usr);
}
modifier auth {
require(wards[msg.sender] == 1, "DaiJoin/not-authorized");
_;
}
VatLike public vat; // CDP Engine
DSTokenLike public dai; // Stablecoin Token
uint public live; // Active Flag
// Events
event Rely(address indexed usr);
event Deny(address indexed usr);
event Join(address indexed usr, uint256 wad);
event Exit(address indexed usr, uint256 wad);
event Cage();
constructor(address vat_, address dai_) public {
wards[msg.sender] = 1;
live = 1;
vat = VatLike(vat_);
dai = DSTokenLike(dai_);
emit Rely(msg.sender);
}
function cage() external auth {
live = 0;
emit Cage();
}
uint constant ONE = 10 ** 27;
function mul(uint x, uint y) internal pure returns (uint z) {
require(y == 0 || (z = x * y) / y == x);
}
function join(address usr, uint wad) external {
require(live == 1, "DaiJoin/not-live"); // Added live check
vat.move(address(this), usr, mul(ONE, wad));
dai.burn(msg.sender, wad);
emit Join(usr, wad);
}
function exit(address usr, uint wad) external {
require(live == 1, "DaiJoin/not-live");
vat.move(msg.sender, address(this), mul(ONE, wad));
dai.mint(usr, wad);
emit Exit(usr, wad);
}
}
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"vat_","internalType":"address"},{"type":"bytes32","name":"ilk_","internalType":"bytes32"},{"type":"address","name":"gem_","internalType":"address"}]},{"type":"event","name":"Cage","inputs":[],"anonymous":false},{"type":"event","name":"Deny","inputs":[{"type":"address","name":"usr","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"Exit","inputs":[{"type":"address","name":"usr","internalType":"address","indexed":true},{"type":"uint256","name":"wad","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Join","inputs":[{"type":"address","name":"usr","internalType":"address","indexed":true},{"type":"uint256","name":"wad","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Rely","inputs":[{"type":"address","name":"usr","internalType":"address","indexed":true}],"anonymous":false},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"cage","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"dec","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"deny","inputs":[{"type":"address","name":"usr","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"exit","inputs":[{"type":"address","name":"usr","internalType":"address"},{"type":"uint256","name":"wad","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract GemLike"}],"name":"gem","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"ilk","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"join","inputs":[{"type":"address","name":"usr","internalType":"address"},{"type":"uint256","name":"wad","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"live","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"rely","inputs":[{"type":"address","name":"usr","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract VatLike"}],"name":"vat","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"wards","inputs":[{"type":"address","name":"","internalType":"address"}]}]
Contract Creation Code
0x608060405234801561001057600080fd5b506040516109893803806109898339818101604052606081101561003357600080fd5b508051602080830151604093840151336000908152808452859020600190819055600581905580546001600160a01b038087166001600160a01b03199283161790925560028490556003805483851692169190911790819055865163313ce56760e01b8152965195969395929491169263313ce5679260048281019392829003018186803b1580156100c457600080fd5b505afa1580156100d8573d6000803e3d6000fd5b505050506040513d60208110156100ee57600080fd5b505160045560405133907fdd0e34038ac38b2a1ce960229778ac48a8719bc900b6c4f8d0475c6e8b385a6090600090a2505050610859806101306000396000f3fe608060405234801561001057600080fd5b50600436106100a95760003560e01c8063957aa58c11610071578063957aa58c146101365780639c52a7f114610150578063b3bcfa8214610176578063bf353dbb1461017e578063c5ce281e146101a4578063ef693bed146101ac576100a9565b806336569e77146100ae5780633b4da69f146100d257806365fae35e1461010057806369245009146101265780637bd2bea71461012e575b600080fd5b6100b66101d8565b604080516001600160a01b039092168252519081900360200190f35b6100fe600480360360408110156100e857600080fd5b506001600160a01b0381351690602001356101e7565b005b6100fe6004803603602081101561011657600080fd5b50356001600160a01b0316610405565b6100fe6104a7565b6100b6610534565b61013e610543565b60408051918252519081900360200190f35b6100fe6004803603602081101561016657600080fd5b50356001600160a01b0316610549565b61013e6105ea565b61013e6004803603602081101561019457600080fd5b50356001600160a01b03166105f0565b61013e610602565b6100fe600480360360408110156101c257600080fd5b506001600160a01b038135169060200135610608565b6001546001600160a01b031681565b600554600114610231576040805162461bcd60e51b815260206004820152601060248201526f47656d4a6f696e2f6e6f742d6c69766560801b604482015290519081900360640190fd5b600081121561027a576040805162461bcd60e51b815260206004820152601060248201526f47656d4a6f696e2f6f766572666c6f7760801b604482015290519081900360640190fd5b60015460025460408051633e6e9fef60e11b815260048101929092526001600160a01b038581166024840152604483018590529051921691637cdd3fde9160648082019260009290919082900301818387803b1580156102d957600080fd5b505af11580156102ed573d6000803e3d6000fd5b5050600354604080516323b872dd60e01b81523360048201523060248201526044810186905290516001600160a01b0390921693506323b872dd92506064808201926020929091908290030181600087803b15801561034b57600080fd5b505af115801561035f573d6000803e3d6000fd5b505050506040513d602081101561037557600080fd5b50516103c2576040805162461bcd60e51b815260206004820152601760248201527623b2b6a537b4b717b330b4b632b216ba3930b739b332b960491b604482015290519081900360640190fd5b6040805182815290516001600160a01b038416917fb4e09949657f21548b58afe74e7b86cd2295da5ff1598ae1e5faecb1cf19ca95919081900360200190a25050565b33600090815260208190526040902054600114610462576040805162461bcd60e51b815260206004820152601660248201527511d95b529bda5b8bdb9bdd0b585d5d1a1bdc9a5e995960521b604482015290519081900360640190fd5b6001600160a01b03811660008181526020819052604080822060019055517fdd0e34038ac38b2a1ce960229778ac48a8719bc900b6c4f8d0475c6e8b385a609190a250565b33600090815260208190526040902054600114610504576040805162461bcd60e51b815260206004820152601660248201527511d95b529bda5b8bdb9bdd0b585d5d1a1bdc9a5e995960521b604482015290519081900360640190fd5b600060058190556040517f2308ed18a14e800c39b86eb6ea43270105955ca385b603b64eca89f98ae8fbda9190a1565b6003546001600160a01b031681565b60055481565b336000908152602081905260409020546001146105a6576040805162461bcd60e51b815260206004820152601660248201527511d95b529bda5b8bdb9bdd0b585d5d1a1bdc9a5e995960521b604482015290519081900360640190fd5b6001600160a01b038116600081815260208190526040808220829055517f184450df2e323acec0ed3b5c7531b81f9b4cdef7914dfd4c0a4317416bb5251b9190a250565b60045481565b60006020819052908152604090205481565b60025481565b600554600114610652576040805162461bcd60e51b815260206004820152601060248201526f47656d4a6f696e2f6e6f742d6c69766560801b604482015290519081900360640190fd5b600160ff1b81111561069e576040805162461bcd60e51b815260206004820152601060248201526f47656d4a6f696e2f6f766572666c6f7760801b604482015290519081900360640190fd5b60015460025460408051633e6e9fef60e11b815260048101929092523360248301526000848103604484015290516001600160a01b0390931692637cdd3fde92606480820193929182900301818387803b1580156106fb57600080fd5b505af115801561070f573d6000803e3d6000fd5b50506003546040805163a9059cbb60e01b81526001600160a01b03878116600483015260248201879052915191909216935063a9059cbb925060448083019260209291908290030181600087803b15801561076957600080fd5b505af115801561077d573d6000803e3d6000fd5b505050506040513d602081101561079357600080fd5b50516107e0576040805162461bcd60e51b815260206004820152601760248201527623b2b6a537b4b717b330b4b632b216ba3930b739b332b960491b604482015290519081900360640190fd5b6040805182815290516001600160a01b038416917f22d324652c93739755cf4581508b60875ebdd78c20c0cff5cf8e23452b299631919081900360200190a2505056fea2646970667358221220972933fbc16b18f243601ff2ca7bf168b8c2a8ad5ca8edff9fabbc8aabcb6f9a64736f6c634300060c003300000000000000000000000016ca93f2f65d5495c874109fff38d11d39850b6757504c532d410000000000000000000000000000000000000000000000000000000000000000000000000000a1077a294dde1b09bb078844df40758a5d0f9a27
Deployed ByteCode
0x608060405234801561001057600080fd5b50600436106100a95760003560e01c8063957aa58c11610071578063957aa58c146101365780639c52a7f114610150578063b3bcfa8214610176578063bf353dbb1461017e578063c5ce281e146101a4578063ef693bed146101ac576100a9565b806336569e77146100ae5780633b4da69f146100d257806365fae35e1461010057806369245009146101265780637bd2bea71461012e575b600080fd5b6100b66101d8565b604080516001600160a01b039092168252519081900360200190f35b6100fe600480360360408110156100e857600080fd5b506001600160a01b0381351690602001356101e7565b005b6100fe6004803603602081101561011657600080fd5b50356001600160a01b0316610405565b6100fe6104a7565b6100b6610534565b61013e610543565b60408051918252519081900360200190f35b6100fe6004803603602081101561016657600080fd5b50356001600160a01b0316610549565b61013e6105ea565b61013e6004803603602081101561019457600080fd5b50356001600160a01b03166105f0565b61013e610602565b6100fe600480360360408110156101c257600080fd5b506001600160a01b038135169060200135610608565b6001546001600160a01b031681565b600554600114610231576040805162461bcd60e51b815260206004820152601060248201526f47656d4a6f696e2f6e6f742d6c69766560801b604482015290519081900360640190fd5b600081121561027a576040805162461bcd60e51b815260206004820152601060248201526f47656d4a6f696e2f6f766572666c6f7760801b604482015290519081900360640190fd5b60015460025460408051633e6e9fef60e11b815260048101929092526001600160a01b038581166024840152604483018590529051921691637cdd3fde9160648082019260009290919082900301818387803b1580156102d957600080fd5b505af11580156102ed573d6000803e3d6000fd5b5050600354604080516323b872dd60e01b81523360048201523060248201526044810186905290516001600160a01b0390921693506323b872dd92506064808201926020929091908290030181600087803b15801561034b57600080fd5b505af115801561035f573d6000803e3d6000fd5b505050506040513d602081101561037557600080fd5b50516103c2576040805162461bcd60e51b815260206004820152601760248201527623b2b6a537b4b717b330b4b632b216ba3930b739b332b960491b604482015290519081900360640190fd5b6040805182815290516001600160a01b038416917fb4e09949657f21548b58afe74e7b86cd2295da5ff1598ae1e5faecb1cf19ca95919081900360200190a25050565b33600090815260208190526040902054600114610462576040805162461bcd60e51b815260206004820152601660248201527511d95b529bda5b8bdb9bdd0b585d5d1a1bdc9a5e995960521b604482015290519081900360640190fd5b6001600160a01b03811660008181526020819052604080822060019055517fdd0e34038ac38b2a1ce960229778ac48a8719bc900b6c4f8d0475c6e8b385a609190a250565b33600090815260208190526040902054600114610504576040805162461bcd60e51b815260206004820152601660248201527511d95b529bda5b8bdb9bdd0b585d5d1a1bdc9a5e995960521b604482015290519081900360640190fd5b600060058190556040517f2308ed18a14e800c39b86eb6ea43270105955ca385b603b64eca89f98ae8fbda9190a1565b6003546001600160a01b031681565b60055481565b336000908152602081905260409020546001146105a6576040805162461bcd60e51b815260206004820152601660248201527511d95b529bda5b8bdb9bdd0b585d5d1a1bdc9a5e995960521b604482015290519081900360640190fd5b6001600160a01b038116600081815260208190526040808220829055517f184450df2e323acec0ed3b5c7531b81f9b4cdef7914dfd4c0a4317416bb5251b9190a250565b60045481565b60006020819052908152604090205481565b60025481565b600554600114610652576040805162461bcd60e51b815260206004820152601060248201526f47656d4a6f696e2f6e6f742d6c69766560801b604482015290519081900360640190fd5b600160ff1b81111561069e576040805162461bcd60e51b815260206004820152601060248201526f47656d4a6f696e2f6f766572666c6f7760801b604482015290519081900360640190fd5b60015460025460408051633e6e9fef60e11b815260048101929092523360248301526000848103604484015290516001600160a01b0390931692637cdd3fde92606480820193929182900301818387803b1580156106fb57600080fd5b505af115801561070f573d6000803e3d6000fd5b50506003546040805163a9059cbb60e01b81526001600160a01b03878116600483015260248201879052915191909216935063a9059cbb925060448083019260209291908290030181600087803b15801561076957600080fd5b505af115801561077d573d6000803e3d6000fd5b505050506040513d602081101561079357600080fd5b50516107e0576040805162461bcd60e51b815260206004820152601760248201527623b2b6a537b4b717b330b4b632b216ba3930b739b332b960491b604482015290519081900360640190fd5b6040805182815290516001600160a01b038416917f22d324652c93739755cf4581508b60875ebdd78c20c0cff5cf8e23452b299631919081900360200190a2505056fea2646970667358221220972933fbc16b18f243601ff2ca7bf168b8c2a8ad5ca8edff9fabbc8aabcb6f9a64736f6c634300060c0033