add domain separator to redeem code
This commit is contained in:
parent
43c40a0618
commit
ee9b14fc29
|
@ -13,7 +13,7 @@ abstract contract Bucket is OwnableUpgradeSafe {
|
||||||
|
|
||||||
bytes32 constant REDEEM_TYPEHASH = keccak256("Redeem(uint256 blockNumber,bytes32 blockHash,address receiver,bytes32 code)");
|
bytes32 constant REDEEM_TYPEHASH = keccak256("Redeem(uint256 blockNumber,bytes32 blockHash,address receiver,bytes32 code)");
|
||||||
bytes32 constant EIP712DOMAIN_TYPEHASH = keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)");
|
bytes32 constant EIP712DOMAIN_TYPEHASH = keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)");
|
||||||
bytes32 DOMAIN_SEPARATOR;
|
bytes32 public DOMAIN_SEPARATOR;
|
||||||
|
|
||||||
string _relayerURI;
|
string _relayerURI;
|
||||||
|
|
||||||
|
@ -86,7 +86,7 @@ abstract contract Bucket is OwnableUpgradeSafe {
|
||||||
require(redeemable.recipient == recipient, "not found");
|
require(redeemable.recipient == recipient, "not found");
|
||||||
|
|
||||||
// validate code
|
// validate code
|
||||||
bytes32 codeHash = keccak256(abi.encodePacked(_redeem.code));
|
bytes32 codeHash = keccak256(abi.encodePacked(DOMAIN_SEPARATOR, redeemable.recipient, _redeem.code));
|
||||||
require(codeHash == redeemable.code, "invalid code");
|
require(codeHash == redeemable.code, "invalid code");
|
||||||
|
|
||||||
uint256 data = redeemable.data;
|
uint256 data = redeemable.data;
|
||||||
|
|
|
@ -9,7 +9,7 @@ module.exports = function(deployer, network) {
|
||||||
deployer.deploy(NFTBucketFactory);
|
deployer.deploy(NFTBucketFactory);
|
||||||
deployer.deploy(ERC20BucketFactory);
|
deployer.deploy(ERC20BucketFactory);
|
||||||
|
|
||||||
if (network === "development") {
|
if (network === "development" || network === "test") {
|
||||||
deployer.deploy(TestToken, "Dev Test Token", "DTT", 18);
|
deployer.deploy(TestToken, "Dev Test Token", "DTT", 18);
|
||||||
deployer.deploy(TestNFT);
|
deployer.deploy(TestNFT);
|
||||||
}
|
}
|
||||||
|
|
|
@ -86,6 +86,7 @@ function mineAt(timestamp) {
|
||||||
|
|
||||||
contract("ERC20Bucket", function () {
|
contract("ERC20Bucket", function () {
|
||||||
let bucketInstance,
|
let bucketInstance,
|
||||||
|
domainSeparator,
|
||||||
factoryInstance,
|
factoryInstance,
|
||||||
tokenInstance,
|
tokenInstance,
|
||||||
shop,
|
shop,
|
||||||
|
@ -134,6 +135,7 @@ contract("ERC20Bucket", function () {
|
||||||
});
|
});
|
||||||
|
|
||||||
bucketInstance = new web3.eth.Contract(ERC20Bucket.abi, rec.options.address);
|
bucketInstance = new web3.eth.Contract(ERC20Bucket.abi, rec.options.address);
|
||||||
|
domainSeparator = await bucketInstance.methods.DOMAIN_SEPARATOR().call();
|
||||||
});
|
});
|
||||||
|
|
||||||
it("deploy bucket via factory", async () => {
|
it("deploy bucket via factory", async () => {
|
||||||
|
@ -196,7 +198,7 @@ contract("ERC20Bucket", function () {
|
||||||
let initialSupply = await bucketInstance.methods.totalSupply().call();
|
let initialSupply = await bucketInstance.methods.totalSupply().call();
|
||||||
let initialAvailableSupply = await bucketInstance.methods.availableSupply().call();
|
let initialAvailableSupply = await bucketInstance.methods.availableSupply().call();
|
||||||
|
|
||||||
const redeemCodeHash = web3.utils.sha3(REDEEM_CODE);
|
const redeemCodeHash = web3.utils.soliditySha3(domainSeparator, keycard, REDEEM_CODE);
|
||||||
const createRedeemable = bucketInstance.methods.createRedeemable(keycard, amount, redeemCodeHash);
|
const createRedeemable = bucketInstance.methods.createRedeemable(keycard, amount, redeemCodeHash);
|
||||||
const createRedeemableGas = await createRedeemable.estimateGas();
|
const createRedeemableGas = await createRedeemable.estimateGas();
|
||||||
await createRedeemable.send({
|
await createRedeemable.send({
|
||||||
|
|
|
@ -91,6 +91,7 @@ if (assert.match === undefined) {
|
||||||
|
|
||||||
contract("NFTBucket", function () {
|
contract("NFTBucket", function () {
|
||||||
let bucketInstance,
|
let bucketInstance,
|
||||||
|
domainSeparator,
|
||||||
factoryInstance,
|
factoryInstance,
|
||||||
tokenInstance,
|
tokenInstance,
|
||||||
shop,
|
shop,
|
||||||
|
@ -141,6 +142,7 @@ contract("NFTBucket", function () {
|
||||||
});
|
});
|
||||||
|
|
||||||
bucketInstance = new web3.eth.Contract(NFTBucket.abi, rec.options.address);
|
bucketInstance = new web3.eth.Contract(NFTBucket.abi, rec.options.address);
|
||||||
|
domainSeparator = await bucketInstance.methods.DOMAIN_SEPARATOR().call();
|
||||||
});
|
});
|
||||||
|
|
||||||
it("deploy bucket via factory", async () => {
|
it("deploy bucket via factory", async () => {
|
||||||
|
@ -159,7 +161,7 @@ contract("NFTBucket", function () {
|
||||||
|
|
||||||
|
|
||||||
function createRedeemableData(recipient) {
|
function createRedeemableData(recipient) {
|
||||||
const redeemCodeHash = web3.utils.sha3(REDEEM_CODE);
|
const redeemCodeHash = web3.utils.soliditySha3(domainSeparator, recipient, REDEEM_CODE);
|
||||||
return recipient + redeemCodeHash.replace("0x", "");
|
return recipient + redeemCodeHash.replace("0x", "");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -45,11 +45,11 @@ module.exports = {
|
||||||
// tab if you use this network and you must also set the `host`, `port` and `network_id`
|
// tab if you use this network and you must also set the `host`, `port` and `network_id`
|
||||||
// options below to some value.
|
// options below to some value.
|
||||||
//
|
//
|
||||||
development: {
|
// development: {
|
||||||
host: "127.0.0.1", // Localhost (default: none)
|
// host: "127.0.0.1", // Localhost (default: none)
|
||||||
port: 7545, // Standard Ethereum port (default: none)
|
// port: 7545, // Standard Ethereum port (default: none)
|
||||||
network_id: "*", // Any network (default: none)
|
// network_id: "*", // Any network (default: none)
|
||||||
},
|
// },
|
||||||
|
|
||||||
// Another network with more advanced options...
|
// Another network with more advanced options...
|
||||||
// advanced: {
|
// advanced: {
|
||||||
|
|
Loading…
Reference in New Issue