@mapprotocol/common-contracts 0.1.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (28) hide show
  1. package/README.md +114 -58
  2. package/artifacts/contracts/AuthorityManager.sol/AuthorityManager.json +2 -2
  3. package/artifacts/contracts/factory/Create2Factory.sol/Create2Factory.json +107 -0
  4. package/contracts/factory/Create2Factory.sol +57 -0
  5. package/package.json +15 -3
  6. package/typechain-types/contracts/factory/Create2Factory.ts +174 -0
  7. package/typechain-types/contracts/factory/index.ts +4 -0
  8. package/typechain-types/contracts/index.ts +2 -0
  9. package/typechain-types/factories/@openzeppelin/contracts/access/manager/AccessManager__factory.ts +1 -1
  10. package/typechain-types/factories/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils__factory.ts +1 -1
  11. package/typechain-types/factories/@openzeppelin/contracts/utils/Address__factory.ts +1 -1
  12. package/typechain-types/factories/@openzeppelin/contracts/utils/Errors__factory.ts +1 -1
  13. package/typechain-types/factories/@openzeppelin/contracts/utils/math/SafeCast__factory.ts +1 -1
  14. package/typechain-types/factories/contracts/AuthorityManager__factory.ts +1 -1
  15. package/typechain-types/factories/contracts/factory/Create2Factory__factory.ts +163 -0
  16. package/typechain-types/factories/contracts/factory/index.ts +4 -0
  17. package/typechain-types/factories/contracts/index.ts +1 -0
  18. package/typechain-types/hardhat.d.ts +18 -0
  19. package/typechain-types/index.ts +2 -0
  20. package/utils/addressCodec.ts +57 -0
  21. package/utils/codeHash.ts +75 -0
  22. package/utils/deployRecord.ts +117 -0
  23. package/utils/deployer.ts +123 -0
  24. package/utils/evmHelper.ts +108 -0
  25. package/utils/factory.ts +210 -0
  26. package/utils/index.ts +42 -0
  27. package/utils/tronHelper.ts +362 -0
  28. package/utils/verifier.ts +225 -0
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @mapprotocol/common-contracts
2
2
 
3
- Common smart contracts library for MAP Protocol.
3
+ Shared smart contracts and TypeScript utilities for MAP Protocol's multi-chain infrastructure.
4
4
 
5
5
  ## Installation
6
6
 
@@ -8,100 +8,156 @@ Common smart contracts library for MAP Protocol.
8
8
  npm install @mapprotocol/common-contracts
9
9
  ```
10
10
 
11
- or
11
+ ## Solidity Contracts
12
12
 
13
- ```bash
14
- yarn add @mapprotocol/common-contracts
13
+ ### BaseImplementation
14
+
15
+ Abstract base for all upgradeable protocol contracts. Combines UUPS proxy, pausable, and access control in one inheritance.
16
+
17
+ ```solidity
18
+ import "@mapprotocol/common-contracts/contracts/base/BaseImplementation.sol";
19
+
20
+ contract MyContract is BaseImplementation {
21
+ function initialize(address _admin) public initializer {
22
+ __BaseImplementation_init(_admin);
23
+ }
24
+ }
15
25
  ```
16
26
 
17
- ## Usage
27
+ **Includes:**
28
+ - `UUPSUpgradeable` — proxy upgrade pattern
29
+ - `PausableUpgradeable` — emergency pause via `trigger()`
30
+ - `AccessManagedUpgradeable` — role-based function access
31
+ - `getImplementation()` — read current implementation address
18
32
 
19
- ### Solidity Contracts
33
+ ### AuthorityManager
20
34
 
21
- Import contracts in your Solidity files:
35
+ Extended `AccessManager` with enumerable role members. One instance per chain controls all protocol contracts.
22
36
 
23
37
  ```solidity
24
- import "@mapprotocol/common-contracts/contracts/base/BaseImplemention.sol";
25
38
  import "@mapprotocol/common-contracts/contracts/AuthorityManager.sol";
26
39
  ```
27
40
 
28
- ### TypeScript/JavaScript
41
+ **Key functions:**
42
+ - `grantRole(roleId, account, delay)` — assign role
43
+ - `revokeRole(roleId, account)` — remove role
44
+ - `setTargetFunctionRole(target, selectors, roleId)` — restrict contract functions to a role
45
+ - `getRoleMembers(roleId)` — list all members of a role
46
+
47
+ ## TypeScript Utilities
29
48
 
30
- Use TypeChain generated types for type-safe contract interactions:
49
+ ### Deployment
31
50
 
32
51
  ```typescript
33
- import { BaseImplement__factory } from "@mapprotocol/common-contracts";
34
- import { ethers } from "ethers";
52
+ import { getDeploymentByKey, saveDeployment, resolveDeploymentEnv } from "@mapprotocol/common-contracts/utils/deployment";
35
53
 
36
- // Deploy or connect to contract
37
- const signer = await ethers.getSigner();
38
- const baseContract = await BaseImplement__factory.deploy(signer);
54
+ // Read deployed address (defaults to <cwd>/deployments/deploy.json)
55
+ const addr = await getDeploymentByKey("Bsc", "Gateway");
39
56
 
40
- // Or connect to existing contract
41
- const contractAddress = "0x...";
42
- const contract = BaseImplement__factory.connect(contractAddress, signer);
57
+ // With custom suffix and path
58
+ const addr = await getDeploymentByKey("Bsc", "Gateway", { suffix: "main", basePath: "./my-deployments" });
59
+
60
+ // Save deployment
61
+ await saveDeployment("Bsc", "Gateway", "0x...");
43
62
  ```
44
63
 
45
- ## Contracts Overview
64
+ ### Tron Interaction
46
65
 
47
- ### Base Contracts
48
- - `BaseImplemention.sol` - Base implementation with common functionality including pausable, reentrancy guard, and UUPS upgradeable patterns
66
+ ```typescript
67
+ import { createTronWeb, tronDeploy, getTronContract, tronToHex, tronFromHex } from "@mapprotocol/common-contracts/utils/tronHelper";
49
68
 
50
- ### Authority Management
51
- - `AuthorityManager.sol` - Authority and access control management
69
+ // Address conversion (pure, no RPC needed)
70
+ const hex = tronToHex("TXyz..."); // -> "0x..."
71
+ const base58 = tronFromHex("0x..."); // -> "TXyz..."
52
72
 
53
- ## Features
73
+ // Deploy contract on Tron
74
+ const tronWeb = createTronWeb({ rpcUrl: "https://api.trongrid.io", privateKey: "..." });
75
+ const addr = await tronDeploy(tronWeb, artifacts, "MyContract", [arg1, arg2]);
54
76
 
55
- - **Upgradeable**: Contracts use UUPS (Universal Upgradeable Proxy Standard) pattern
56
- - **Pausable**: Emergency pause functionality for critical operations
57
- - **Reentrancy Protection**: Built-in reentrancy guards for secure operations
58
- - **Access Control**: Flexible authority management system
59
- - **TypeScript Support**: Full TypeChain generated types for type-safe development
77
+ // Read-only (no privateKey needed)
78
+ const readOnly = createTronWeb({ rpcUrl: "https://api.trongrid.io" });
79
+ const contract = await getTronContract(readOnly, artifacts, "MyContract", addr);
80
+ ```
60
81
 
61
- ## Development
82
+ ### Address Encoding
62
83
 
63
- This library uses a dual toolchain setup:
84
+ ```typescript
85
+ import { addressToHex, isTronAddress, isSolanaChain } from "@mapprotocol/common-contracts/utils/addressCodec";
64
86
 
65
- ### Foundry
66
- ```bash
67
- forge build # Build contracts
68
- forge test # Run tests
69
- forge fmt # Format code
87
+ // Auto-detect format and convert to hex
88
+ addressToHex("0xAbC..."); // EVM -> lowercase hex
89
+ addressToHex("TXyz..."); // Tron -> extract 20-byte address
90
+ addressToHex("So11111..."); // Solana -> full base58 decode
91
+
92
+ // Type checks
93
+ isTronAddress("TXyz..."); // true (validates 0x41 prefix byte)
94
+ isSolanaChain("Sol"); // true
70
95
  ```
71
96
 
72
- ### Hardhat
73
- ```bash
74
- npm run build:hardhat # Build with Hardhat
75
- npm run test:hardhat # Run Hardhat tests
76
- npm run compile # Compile and generate types
97
+ ## Forge Script Base
98
+
99
+ For monorepo projects, `script/Base.s.sol` provides deployment primitives:
100
+
101
+ ```solidity
102
+ import {BaseScript} from "../../common/script/Base.s.sol";
103
+
104
+ contract MyDeploy is BaseScript {
105
+ function run() public broadcast {
106
+ // CREATE2 factory deployment (deterministic address)
107
+ address addr = deployByFactory("my_salt", type(MyContract).creationCode, abi.encode(arg));
108
+
109
+ // Check factory availability
110
+ require(isFactoryAvailable(), "no factory on this chain");
111
+
112
+ // UUPS proxy upgrade
113
+ upgradeProxy(proxyAddr, newImplAddr);
114
+
115
+ // Deploy new impl + upgrade in one step
116
+ deployAndUpgrade(proxyAddr, type(MyContractV2).creationCode);
117
+ }
118
+ }
77
119
  ```
78
120
 
79
- ### Other Commands
121
+ ## Development
122
+
80
123
  ```bash
81
- npm run clean # Clean all artifacts
82
- npm run typecheck # Check TypeScript types
83
- npm run gas-report # Generate gas usage report
84
- npm run coverage # Generate test coverage
124
+ # Build
125
+ forge build # Foundry
126
+ npm run build:hardhat # Hardhat + TypeChain
127
+
128
+ # Test
129
+ forge test
130
+ forge test --gas-report
131
+
132
+ # Format
133
+ forge fmt
134
+
135
+ # Publish
136
+ npm run prepublishOnly # clean + build + typecheck
137
+ npm publish
85
138
  ```
86
139
 
87
- ## Requirements
140
+ ## Package Contents
88
141
 
89
- - Node.js >= 18.0.0
90
- - Solidity 0.8.20
142
+ | Path | Description |
143
+ |------|-------------|
144
+ | `contracts/**/*.sol` | Solidity source files |
145
+ | `artifacts/**/*.json` | Compiled ABI + bytecode |
146
+ | `typechain-types/**/*` | TypeChain generated types |
147
+ | `utils/*.ts` | Shared TypeScript utilities |
91
148
 
92
- ## Dependencies
149
+ ## Requirements
93
150
 
94
- - OpenZeppelin Contracts v5.0.0
95
- - OpenZeppelin Contracts Upgradeable v5.0.0
151
+ - Solidity ^0.8.20
152
+ - Node.js >= 18
153
+ - OpenZeppelin Contracts 5.4.0
96
154
 
97
155
  ## License
98
156
 
99
157
  MIT
100
158
 
101
- ## Repository
102
-
103
- [GitHub](https://github.com/mapprotocol/mapo-contracts-v2/tree/main/common)
104
-
105
- ## Issues
159
+ ## Links
106
160
 
107
- Please report issues at [GitHub Issues](https://github.com/mapprotocol/mapo-contracts-v2/issues)
161
+ - [Repository](https://github.com/mapprotocol/mapo-contracts-v2/tree/main/common)
162
+ - [Issues](https://github.com/mapprotocol/mapo-contracts-v2/issues)
163
+ - [MAP Protocol](https://mapprotocol.io)
@@ -1230,8 +1230,8 @@
1230
1230
  "type": "function"
1231
1231
  }
1232
1232
  ],
1233
- "bytecode": "0x60806040523480156200001157600080fd5b50604051620032f5380380620032f5833981016040819052620000349162000529565b806001600160a01b0381166200006557604051630409d6d160e11b8152600060048201526024015b60405180910390fd5b620000746000828180620000b3565b5050600080526004602052620000ab7f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ec826200030a565b5050620005ba565b60006002600160401b03196001600160401b03861601620000f35760405163061c6a4360e21b81526001600160401b03861660048201526024016200005c565b6001600160401b03851660009081526001602090815260408083206001600160a01b038816845290915281205465ffffffffffff1615908115620001f25763ffffffff8516620001426200032a565b6200014e919062000571565b905060405180604001604052808265ffffffffffff168152602001620001808663ffffffff166200033c60201b60201c565b6001600160701b039081169091526001600160401b03891660009081526001602090815260408083206001600160a01b038c16845282529091208351815494909201519092166601000000000000026001600160a01b031990931665ffffffffffff909116179190911790556200029c565b6001600160401b03871660009081526001602090815260408083206001600160a01b038a168452909152812054620002419166010000000000009091046001600160701b031690869062000345565b6001600160401b03891660009081526001602090815260408083206001600160a01b038c168452909152902080546001600160701b03909316660100000000000002600160301b600160a01b03199093169290921790915590505b6040805163ffffffff8616815265ffffffffffff831660208201528315158183015290516001600160a01b038816916001600160401b038a16917ff98448b987f1428e0e230e1f3c6e2ce15b5693eaf31827fbd0b1ec4b424ae7cf9181900360600190a35095945050505050565b600062000321836001600160a01b038416620003fa565b90505b92915050565b600062000337426200044c565b905090565b63ffffffff1690565b600080806200035d6001600160701b03871662000485565b90506000620003a08563ffffffff168763ffffffff168463ffffffff16116200038857600062000394565b6200039488856200059a565b63ffffffff16620004a6565b905063ffffffff8116620003b36200032a565b620003bf919062000571565b925063ffffffff8616602083901b67ffffffff0000000016604085901b6dffffffffffff000000000000000016171793505050935093915050565b6000818152600183016020526040812054620004435750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562000324565b50600062000324565b600065ffffffffffff82111562000481576040516306dfcc6560e41b815260306004820152602481018390526044016200005c565b5090565b6000806200049c6001600160701b038416620004b7565b5090949350505050565b600082821882841102821862000321565b60008080620004d084620004ca6200032a565b620004dd565b9250925092509193909250565b6001600160501b03602083901c166001600160701b03831665ffffffffffff604085901c811690841681111562000517578282826200051c565b816000805b9250925092509250925092565b6000602082840312156200053c57600080fd5b81516001600160a01b03811681146200055457600080fd5b9392505050565b634e487b7160e01b600052601160045260246000fd5b65ffffffffffff8181168382160190808211156200059357620005936200055b565b5092915050565b63ffffffff8281168282160390808211156200059357620005936200055b565b612d2b80620005ca6000396000f3fe6080604052600436106102045760003560e01c806375b238fc11610118578063b7d2b162116100a0578063d6bb62c61161006f578063d6bb62c6146106cc578063d78a83b1146106ec578063f801a69814610724578063fc8610d11461075e578063fe0776f51461077e57600080fd5b8063b7d2b16214610656578063cc1b6c8114610676578063d1f856ee1461068c578063d22b5989146106ac57600080fd5b8063a5808e2f116100e7578063a5808e2f14610572578063a64d95ce1461059f578063abd9bd2a146105bf578063ac9650d8146105ed578063b70096131461061a57600080fd5b806375b238fc146104ed578063853551b81461050257806394c7d7ee14610522578063a166aa891461054257600080fd5b806330cae1871161019b5780634665096d1161016a5780634665096d1461043a5780634c1da1e2146104505780635296295214610470578063530dd456146104905780636d5115bd146104cd57600080fd5b806330cae1871461038e5780633adc277a146103ae5780633ca7c02a146103e55780634136a33c1461040057600080fd5b806318ff183c116101d757806318ff183c146102e15780631cff79cd1461030157806325c471a0146103145780633078f1141461033457600080fd5b806308d6122d146102095780630b0a93ba1461022b57806312be87271461028c578063167bd395146102c1575b600080fd5b34801561021557600080fd5b506102296102243660046124fa565b61079e565b005b34801561023757600080fd5b5061026f610246366004612560565b6001600160401b0390811660009081526001602081905260409091200154600160401b90041690565b6040516001600160401b0390911681526020015b60405180910390f35b34801561029857600080fd5b506102ac6102a7366004612560565b6107f1565b60405163ffffffff9091168152602001610283565b3480156102cd57600080fd5b506102296102dc36600461257b565b61082c565b3480156102ed57600080fd5b506102296102fc3660046125b9565b610842565b6102ac61030f366004612628565b6108a9565b34801561032057600080fd5b5061022961032f366004612690565b6109d9565b34801561034057600080fd5b5061035461034f3660046126d5565b610a27565b604051610283949392919065ffffffffffff948516815263ffffffff93841660208201529190921660408201529116606082015260800190565b34801561039a57600080fd5b506102296103a93660046126f1565b610a8c565b3480156103ba57600080fd5b506103ce6103c9366004612724565b610a9e565b60405165ffffffffffff9091168152602001610283565b3480156103f157600080fd5b5061026f6001600160401b0381565b34801561040c57600080fd5b506102ac61041b366004612724565b600090815260026020526040902054600160301b900463ffffffff1690565b34801561044657600080fd5b5062093a806102ac565b34801561045c57600080fd5b506102ac61046b36600461273d565b610ad1565b34801561047c57600080fd5b5061022961048b3660046126f1565b610aff565b34801561049c57600080fd5b5061026f6104ab366004612560565b6001600160401b03908116600090815260016020819052604090912001541690565b3480156104d957600080fd5b5061026f6104e8366004612770565b610b11565b3480156104f957600080fd5b5061026f600081565b34801561050e57600080fd5b5061022961051d36600461279e565b610b4c565b34801561052e57600080fd5b5061022961053d366004612628565b610be3565b34801561054e57600080fd5b5061056261055d36600461273d565b610c8f565b6040519015158152602001610283565b34801561057e57600080fd5b5061059261058d366004612560565b610cb7565b60405161028391906127bc565b3480156105ab57600080fd5b506102296105ba366004612809565b610cdb565b3480156105cb57600080fd5b506105df6105da366004612833565b610ced565b604051908152602001610283565b3480156105f957600080fd5b5061060d610608366004612897565b610d26565b60405161028391906128fc565b34801561062657600080fd5b5061063a610635366004612976565b610e0d565b60408051921515835263ffffffff909116602083015201610283565b34801561066257600080fd5b506102296106713660046126d5565b610e94565b34801561068257600080fd5b50620697806102ac565b34801561069857600080fd5b5061063a6106a73660046126d5565b610ed7565b3480156106b857600080fd5b506102296106c73660046129c1565b610f54565b3480156106d857600080fd5b506102ac6106e7366004612833565b610f66565b3480156106f857600080fd5b5061070c6107073660046129df565b6110c0565b6040516001600160a01b039091168152602001610283565b34801561073057600080fd5b5061074461073f366004612a09565b6110e2565b6040805192835263ffffffff909116602083015201610283565b34801561076a57600080fd5b506105df610779366004612560565b611227565b34801561078a57600080fd5b506102296107993660046126d5565b611248565b6107a6611271565b60005b828110156107ea576107e2858585848181106107c7576107c7612a7b565b90506020020160208101906107dc9190612a91565b846112ec565b6001016107a9565b5050505050565b6001600160401b03811660009081526001602081905260408220015461082690600160801b90046001600160701b031661136e565b92915050565b610834611271565b61083e828261138d565b5050565b61084a611271565b604051637a9e5e4b60e01b81526001600160a01b038281166004830152831690637a9e5e4b90602401600060405180830381600087803b15801561088d57600080fd5b505af11580156108a1573d6000803e3d6000fd5b505050505050565b60003381806108ba838888886113ff565b91509150811580156108d0575063ffffffff8116155b156109235782876108e18888611452565b6040516381c6f24b60e01b81526001600160a01b0393841660048201529290911660248301526001600160e01b03191660448201526064015b60405180910390fd5b600061093184898989610ced565b9050600063ffffffff8316151580610958575061094d82610a9e565b65ffffffffffff1615155b15610969576109668261146a565b90505b60035461097f8a61097a8b8b611452565b61156a565b6003819055506109c78a8a8a8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152503492506115ac915050565b506003559450505050505b9392505050565b6109e1611271565b60006109f784846109f1876107f1565b85611650565b90508015610a21576001600160401b03841660009081526004602052604090206107ea908461189b565b50505050565b6001600160401b03821660009081526001602090815260408083206001600160a01b03851684529091528120805465ffffffffffff811692918291829190610a7e90600160301b90046001600160701b03166118b0565b969991985096509350505050565b610a94611271565b61083e82826118d3565b60008181526002602052604081205465ffffffffffff16610abe81611977565b610ac857806109d2565b60009392505050565b6001600160a01b038116600090815260208190526040812060010154610826906001600160701b031661136e565b610b07611271565b61083e82826119a6565b6001600160a01b0382166000908152602081815260408083206001600160e01b0319851684529091529020546001600160401b031692915050565b610b54611271565b6001600160401b0383161580610b7257506001600160401b03838116145b15610b9b5760405163061c6a4360e21b81526001600160401b038416600482015260240161091a565b826001600160401b03167f1256f5b5ecb89caec12db449738f2fbcd1ba5806cf38f35413f4e5c15bf6a4508383604051610bd6929190612ad7565b60405180910390a2505050565b60408051638fb3603760e01b80825291513392918391638fb36037916004808201926020929091908290030181865afa158015610c24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c489190612af3565b6001600160e01b03191614610c7b57604051630641fee960e31b81526001600160a01b038216600482015260240161091a565b6107ea610c8a85838686610ced565b61146a565b6001600160a01b0316600090815260208190526040902060010154600160701b900460ff1690565b6001600160401b038116600090815260046020526040902060609061082690611a58565b610ce3611271565b61083e8282611a65565b600084848484604051602001610d069493929190612b10565b604051602081830303815290604052805190602001209050949350505050565b604080516000815260208101909152606090826001600160401b03811115610d5057610d50612b90565b604051908082528060200260200182016040528015610d8357816020015b6060815260200190600190039081610d6e5790505b50915060005b83811015610e0557610de030868684818110610da757610da7612a7b565b9050602002810190610db99190612ba6565b85604051602001610dcc93929190612bec565b604051602081830303815290604052611b76565b838281518110610df257610df2612a7b565b6020908102919091010152600101610d89565b505092915050565b600080610e1984610c8f565b15610e2957506000905080610e8c565b306001600160a01b03861603610e4e57610e438484611bec565b600091509150610e8c565b6000610e5a8585610b11565b9050600080610e698389610ed7565b9150915081610e7a57600080610e84565b63ffffffff811615815b945094505050505b935093915050565b610e9c611271565b6000610ea88383611c03565b90508015610ed2576001600160401b0383166000908152600460205260409020610a219083611cf0565b505050565b60008067fffffffffffffffe196001600160401b03851601610eff5750600190506000610f4d565b600080610f0c8686610a27565b5050915091508165ffffffffffff16600014158015610f425750610f2e611d05565b65ffffffffffff168265ffffffffffff1611155b93509150610f4d9050565b9250929050565b610f5c611271565b61083e8282611d15565b60003381610f748585611452565b90506000610f8488888888610ced565b60008181526002602052604081205491925065ffffffffffff9091169003610fc25760405163060a299b60e41b81526004810182905260240161091a565b826001600160a01b0316886001600160a01b03161461105e576000610fe8600085610ed7565b5090506000611003610ffd6102468b87610b11565b86610ed7565b50905081158015611012575080155b1561105b57604051630ff89d4760e21b81526001600160a01b038087166004830152808c1660248301528a1660448201526001600160e01b03198516606482015260840161091a565b50505b600081815260026020526040808220805465ffffffffffff1916908190559051600160301b90910463ffffffff1691829184917fbd9ac67a6e2f6463b80927326310338bcbb4bdb7936ce1365ea3e01067e7b9f791a398975050505050505050565b6001600160401b03821660009081526004602052604081206109d29083611dd2565b60008033816110f3828989896113ff565b91505060008163ffffffff16611107611d05565b6111119190612c13565b905063ffffffff82161580611148575060008665ffffffffffff1611801561114857508065ffffffffffff168665ffffffffffff16105b156111595782896108e18a8a611452565b6111738665ffffffffffff168265ffffffffffff16611dde565b9550611181838a8a8a610ced565b945061118c85611dee565b60008581526002602052604090819020805465ffffffffffff891669ffffffffffffffffffff19821617600160301b9182900463ffffffff90811660010190811692830291909117909255915190955086907f82a2da5dee54ea8021c6545b4444620291e07ee83be6dd57edb175062715f3b490611213908a9088908f908f908f90612c32565b60405180910390a350505094509492505050565b6001600160401b038116600090815260046020526040812061082690611e3b565b6001600160a01b0381163314610e9c57604051635f159e6360e01b815260040160405180910390fd5b33600080611280838236611e45565b9150915081610ed2578063ffffffff166000036112dc5760006112a38136611f0f565b5060405163f07e038f60e01b81526001600160a01b03871660048201526001600160401b0382166024820152909250604401905061091a565b610a21610c8a8430600036610ced565b6001600160a01b0383166000818152602081815260408083206001600160e01b0319871680855290835292819020805467ffffffffffffffff19166001600160401b038716908117909155905192835292917f9ea6790c7dadfd01c9f8b9762b3682607af2c7e79e05a9f9fdf5580dde949151910160405180910390a3505050565b600080611383836001600160701b03166118b0565b5090949350505050565b6001600160a01b038216600081815260208190526040908190206001018054841515600160701b0260ff60701b19909116179055517f90d4e7bb7e5d933792b3562e1741306f8be94837e1348dacef9b6f1df56eb138906113f390841515815260200190565b60405180910390a25050565b600080306001600160a01b038616036114265761141d868585611e45565b91509150611449565b600483106114425761143d86866106358787611452565b61141d565b5060009050805b94509492505050565b60006114616004828486612b66565b6109d291612c78565b60008181526002602052604081205465ffffffffffff811690600160301b900463ffffffff168183036114b35760405163060a299b60e41b81526004810185905260240161091a565b6114bb611d05565b65ffffffffffff168265ffffffffffff1611156114ee57604051630c65b5bd60e11b81526004810185905260240161091a565b6114f782611977565b1561151857604051631e2975b960e21b81526004810185905260240161091a565b600084815260026020526040808220805465ffffffffffff191690555163ffffffff83169186917f76a2a46953689d4861a5d3f6ed883ad7e6af674a21f8e162707159fc9dde614d9190a39392505050565b604080516001600160a01b03939093166020808501919091526001600160e01b0319929092168382015280518084038201815260609093019052815191012090565b6060814710156115d85760405163cf47918160e01b81524760048201526024810183905260440161091a565b600080856001600160a01b031684866040516115f49190612ca6565b60006040518083038185875af1925050503d8060008114611631576040519150601f19603f3d011682016040523d82523d6000602084013e611636565b606091505b5091509150611646868383612101565b9695505050505050565b600067fffffffffffffffe196001600160401b0386160161168f5760405163061c6a4360e21b81526001600160401b038616600482015260240161091a565b6001600160401b03851660009081526001602090815260408083206001600160a01b038816845290915281205465ffffffffffff1615908115611781578463ffffffff166116db611d05565b6116e59190612c13565b905060405180604001604052808265ffffffffffff1681526020016117138663ffffffff1663ffffffff1690565b6001600160701b039081169091526001600160401b03891660009081526001602090815260408083206001600160a01b038c1684528252909120835181549490920151909216600160301b026001600160a01b031990931665ffffffffffff9091161791909117905561182d565b6001600160401b03871660009081526001602090815260408083206001600160a01b038a1684529091528120546117cb91600160301b9091046001600160701b031690869061215d565b6001600160401b03891660009081526001602090815260408083206001600160a01b038c168452909152902080546001600160701b03909316600160301b0273ffffffffffffffffffffffffffff000000000000199093169290921790915590505b6040805163ffffffff8616815265ffffffffffff831660208201528315158183015290516001600160a01b038816916001600160401b038a16917ff98448b987f1428e0e230e1f3c6e2ce15b5693eaf31827fbd0b1ec4b424ae7cf9181900360600190a35095945050505050565b60006109d2836001600160a01b038416612207565b60008060006118c6846118c1611d05565b612256565b9250925092509193909250565b6001600160401b03821615806118f157506001600160401b03828116145b1561191a5760405163061c6a4360e21b81526001600160401b038316600482015260240161091a565b6001600160401b038281166000818152600160208190526040808320909101805467ffffffffffffffff19169486169485179055517f1fd6dd7631312dfac2205b52913f99de03b4d7e381d5d27d3dbfe0713e6e63409190a35050565b6000611981611d05565b65ffffffffffff1661199662093a8084612c13565b65ffffffffffff16111592915050565b6001600160401b03821615806119c457506001600160401b03828116145b156119ed5760405163061c6a4360e21b81526001600160401b038316600482015260240161091a565b6001600160401b03828116600081815260016020819052604080832090910180546fffffffffffffffff00000000000000001916600160401b958716958602179055517f7a8059630b897b5de4c08ade69f8b90c3ead1f8596d62d10b6c4d14a0afb4ae29190a35050565b606060006109d2836122a3565b67fffffffffffffffe196001600160401b03831601611aa25760405163061c6a4360e21b81526001600160401b038316600482015260240161091a565b6001600160401b038216600090815260016020819052604082200154611adc90600160801b90046001600160701b0316836206978061215d565b6001600160401b0385166000818152600160208190526040918290200180546001600160701b03909516600160801b026dffffffffffffffffffffffffffff60801b199095169490941790935591519092507ffeb69018ee8b8fd50ea86348f1267d07673379f72cffdeccec63853ee8ce8b4890610bd6908590859063ffffffff92909216825265ffffffffffff16602082015260400190565b6060600080846001600160a01b031684604051611b939190612ca6565b600060405180830381855af49150503d8060008114611bce576040519150601f19603f3d011682016040523d82523d6000602084013e611bd3565b606091505b5091509150611be3858383612101565b95945050505050565b6000611bf8838361156a565b600354149392505050565b600067fffffffffffffffe196001600160401b03841601611c425760405163061c6a4360e21b81526001600160401b038416600482015260240161091a565b6001600160401b03831660009081526001602090815260408083206001600160a01b038616845290915281205465ffffffffffff169003611c8557506000610826565b6001600160401b03831660008181526001602090815260408083206001600160a01b038716808552925280832080546001600160a01b0319169055519092917ff229baa593af28c41b1d16b748cd7688f0c83aaf92d4be41c44005defe84c16691a350600192915050565b60006109d2836001600160a01b0384166122ff565b6000611d10426123f9565b905090565b6001600160a01b038216600090815260208190526040812060010154611d48906001600160701b0316836206978061215d565b6001600160a01b0385166000818152602081815260409182902060010180546dffffffffffffffffffffffffffff19166001600160701b039690961695909517909455805163ffffffff8716815265ffffffffffff841694810194909452919350917fa56b76017453f399ec2327ba00375dbfb1fd070ff854341ad6191e6a2e2de19c9101610bd6565b60006109d28383612430565b60008282188284110282186109d2565b60008181526002602052604090205465ffffffffffff168015801590611e1a5750611e1881611977565b155b1561083e5760405163813e945960e01b81526004810183905260240161091a565b6000610826825490565b6000806004831015611e5c57506000905080610e8c565b306001600160a01b03861603611e7f57610e4330611e7a8686611452565b611bec565b6000806000611e8e8787611f0f565b92509250925082158015611ea65750611ea630610c8f565b15611eba5760008094509450505050610e8c565b600080611ec7848b610ed7565b9150915081611ee157600080965096505050505050610e8c565b611ef78363ffffffff168263ffffffff16611dde565b63ffffffff8116159b909a5098505050505050505050565b600080806004841015611f2a575060009150819050806120fa565b6000611f368686611452565b90506001600160e01b031981166310a6aa3760e31b1480611f6757506001600160e01b031981166330cae18760e01b145b80611f8257506001600160e01b0319811663294b14a960e11b145b80611f9d57506001600160e01b03198116635326cae760e11b145b80611fb857506001600160e01b0319811663d22b598960e01b145b15611fce576001600080935093509350506120fa565b6001600160e01b0319811663063fc60f60e21b1480611ffd57506001600160e01b0319811663167bd39560e01b145b8061201857506001600160e01b031981166308d6122d60e01b145b1561205a57600061202d60246004888a612b66565b81019061203a919061273d565b9050600061204782610ad1565b600196506000955093506120fa92505050565b6001600160e01b0319811663012e238d60e51b148061208957506001600160e01b03198116635be958b160e11b145b156120e457600061209e60246004888a612b66565b8101906120ab9190612560565b905060016120d5826001600160401b03908116600090815260016020819052604090912001541690565b600094509450945050506120fa565b60006120f03083610b11565b6000935093509350505b9250925092565b606082612116576121118261245a565b6109d2565b815115801561212d57506001600160a01b0384163b155b1561215657604051639996b31560e01b81526001600160a01b038516600482015260240161091a565b50806109d2565b6000806000612174866001600160701b031661136e565b905060006121b18563ffffffff168763ffffffff168463ffffffff161161219c5760006121a6565b6121a68885612cc2565b63ffffffff16611dde565b90508063ffffffff166121c2611d05565b6121cc9190612c13565b925063ffffffff8616602083901b67ffffffff0000000016604085901b6dffffffffffff000000000000000016171793505050935093915050565b600081815260018301602052604081205461224e57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610826565b506000610826565b69ffffffffffffffffffff602083901c166001600160701b03831665ffffffffffff604085901c811690841681111561229157828282612296565b816000805b9250925092509250925092565b6060816000018054806020026020016040519081016040528092919081815260200182805480156122f357602002820191906000526020600020905b8154815260200190600101908083116122df575b50505050509050919050565b600081815260018301602052604081205480156123e8576000612323600183612b53565b855490915060009061233790600190612b53565b905080821461239c57600086600001828154811061235757612357612a7b565b906000526020600020015490508087600001848154811061237a5761237a612a7b565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806123ad576123ad612cdf565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610826565b6000915050610826565b5092915050565b600065ffffffffffff82111561242c576040516306dfcc6560e41b8152603060048201526024810183905260440161091a565b5090565b600082600001828154811061244757612447612a7b565b9060005260206000200154905092915050565b80511561246957805160208201fd5b60405163d6bda27560e01b815260040160405180910390fd5b50565b6001600160a01b038116811461248257600080fd5b60008083601f8401126124ac57600080fd5b5081356001600160401b038111156124c357600080fd5b6020830191508360208260051b8501011115610f4d57600080fd5b80356001600160401b03811681146124f557600080fd5b919050565b6000806000806060858703121561251057600080fd5b843561251b81612485565b935060208501356001600160401b0381111561253657600080fd5b6125428782880161249a565b90945092506125559050604086016124de565b905092959194509250565b60006020828403121561257257600080fd5b6109d2826124de565b6000806040838503121561258e57600080fd5b823561259981612485565b9150602083013580151581146125ae57600080fd5b809150509250929050565b600080604083850312156125cc57600080fd5b82356125d781612485565b915060208301356125ae81612485565b60008083601f8401126125f957600080fd5b5081356001600160401b0381111561261057600080fd5b602083019150836020828501011115610f4d57600080fd5b60008060006040848603121561263d57600080fd5b833561264881612485565b925060208401356001600160401b0381111561266357600080fd5b61266f868287016125e7565b9497909650939450505050565b803563ffffffff811681146124f557600080fd5b6000806000606084860312156126a557600080fd5b6126ae846124de565b925060208401356126be81612485565b91506126cc6040850161267c565b90509250925092565b600080604083850312156126e857600080fd5b6125d7836124de565b6000806040838503121561270457600080fd5b61270d836124de565b915061271b602084016124de565b90509250929050565b60006020828403121561273657600080fd5b5035919050565b60006020828403121561274f57600080fd5b81356109d281612485565b6001600160e01b03198116811461248257600080fd5b6000806040838503121561278357600080fd5b823561278e81612485565b915060208301356125ae8161275a565b6000806000604084860312156127b357600080fd5b612648846124de565b6020808252825182820181905260009190848201906040850190845b818110156127fd5783516001600160a01b0316835292840192918401916001016127d8565b50909695505050505050565b6000806040838503121561281c57600080fd5b612825836124de565b915061271b6020840161267c565b6000806000806060858703121561284957600080fd5b843561285481612485565b9350602085013561286481612485565b925060408501356001600160401b0381111561287f57600080fd5b61288b878288016125e7565b95989497509550505050565b600080602083850312156128aa57600080fd5b82356001600160401b038111156128c057600080fd5b6128cc8582860161249a565b90969095509350505050565b60005b838110156128f35781810151838201526020016128db565b50506000910152565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561296957878503603f190184528151805180875261294a818989018a85016128d8565b601f01601f191695909501860194509285019290850190600101612923565b5092979650505050505050565b60008060006060848603121561298b57600080fd5b833561299681612485565b925060208401356129a681612485565b915060408401356129b68161275a565b809150509250925092565b600080604083850312156129d457600080fd5b823561282581612485565b600080604083850312156129f257600080fd5b6129fb836124de565b946020939093013593505050565b60008060008060608587031215612a1f57600080fd5b8435612a2a81612485565b935060208501356001600160401b03811115612a4557600080fd5b612a51878288016125e7565b909450925050604085013565ffffffffffff81168114612a7057600080fd5b939692955090935050565b634e487b7160e01b600052603260045260246000fd5b600060208284031215612aa357600080fd5b81356109d28161275a565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b602081526000612aeb602083018486612aae565b949350505050565b600060208284031215612b0557600080fd5b81516109d28161275a565b6001600160a01b038581168252841660208201526060604082018190526000906116469083018486612aae565b634e487b7160e01b600052601160045260246000fd5b8181038181111561082657610826612b3d565b60008085851115612b7657600080fd5b83861115612b8357600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000808335601e19843603018112612bbd57600080fd5b8301803591506001600160401b03821115612bd757600080fd5b602001915036819003821315610f4d57600080fd5b828482376000838201600081528351612c098183602088016128d8565b0195945050505050565b65ffffffffffff8181168382160190808211156123f2576123f2612b3d565b65ffffffffffff861681526001600160a01b03858116602083015284166040820152608060608201819052600090612c6d9083018486612aae565b979650505050505050565b6001600160e01b03198135818116916004851015610e055760049490940360031b84901b1690921692915050565b60008251612cb88184602087016128d8565b9190910192915050565b63ffffffff8281168282160390808211156123f2576123f2612b3d565b634e487b7160e01b600052603160045260246000fdfea264697066735822122082b7987ba44be1d04aac83a74292b30bc191863fff65197a8cffa32e6e47ab1464736f6c63430008180033",
1234
- "deployedBytecode": "0x6080604052600436106102045760003560e01c806375b238fc11610118578063b7d2b162116100a0578063d6bb62c61161006f578063d6bb62c6146106cc578063d78a83b1146106ec578063f801a69814610724578063fc8610d11461075e578063fe0776f51461077e57600080fd5b8063b7d2b16214610656578063cc1b6c8114610676578063d1f856ee1461068c578063d22b5989146106ac57600080fd5b8063a5808e2f116100e7578063a5808e2f14610572578063a64d95ce1461059f578063abd9bd2a146105bf578063ac9650d8146105ed578063b70096131461061a57600080fd5b806375b238fc146104ed578063853551b81461050257806394c7d7ee14610522578063a166aa891461054257600080fd5b806330cae1871161019b5780634665096d1161016a5780634665096d1461043a5780634c1da1e2146104505780635296295214610470578063530dd456146104905780636d5115bd146104cd57600080fd5b806330cae1871461038e5780633adc277a146103ae5780633ca7c02a146103e55780634136a33c1461040057600080fd5b806318ff183c116101d757806318ff183c146102e15780631cff79cd1461030157806325c471a0146103145780633078f1141461033457600080fd5b806308d6122d146102095780630b0a93ba1461022b57806312be87271461028c578063167bd395146102c1575b600080fd5b34801561021557600080fd5b506102296102243660046124fa565b61079e565b005b34801561023757600080fd5b5061026f610246366004612560565b6001600160401b0390811660009081526001602081905260409091200154600160401b90041690565b6040516001600160401b0390911681526020015b60405180910390f35b34801561029857600080fd5b506102ac6102a7366004612560565b6107f1565b60405163ffffffff9091168152602001610283565b3480156102cd57600080fd5b506102296102dc36600461257b565b61082c565b3480156102ed57600080fd5b506102296102fc3660046125b9565b610842565b6102ac61030f366004612628565b6108a9565b34801561032057600080fd5b5061022961032f366004612690565b6109d9565b34801561034057600080fd5b5061035461034f3660046126d5565b610a27565b604051610283949392919065ffffffffffff948516815263ffffffff93841660208201529190921660408201529116606082015260800190565b34801561039a57600080fd5b506102296103a93660046126f1565b610a8c565b3480156103ba57600080fd5b506103ce6103c9366004612724565b610a9e565b60405165ffffffffffff9091168152602001610283565b3480156103f157600080fd5b5061026f6001600160401b0381565b34801561040c57600080fd5b506102ac61041b366004612724565b600090815260026020526040902054600160301b900463ffffffff1690565b34801561044657600080fd5b5062093a806102ac565b34801561045c57600080fd5b506102ac61046b36600461273d565b610ad1565b34801561047c57600080fd5b5061022961048b3660046126f1565b610aff565b34801561049c57600080fd5b5061026f6104ab366004612560565b6001600160401b03908116600090815260016020819052604090912001541690565b3480156104d957600080fd5b5061026f6104e8366004612770565b610b11565b3480156104f957600080fd5b5061026f600081565b34801561050e57600080fd5b5061022961051d36600461279e565b610b4c565b34801561052e57600080fd5b5061022961053d366004612628565b610be3565b34801561054e57600080fd5b5061056261055d36600461273d565b610c8f565b6040519015158152602001610283565b34801561057e57600080fd5b5061059261058d366004612560565b610cb7565b60405161028391906127bc565b3480156105ab57600080fd5b506102296105ba366004612809565b610cdb565b3480156105cb57600080fd5b506105df6105da366004612833565b610ced565b604051908152602001610283565b3480156105f957600080fd5b5061060d610608366004612897565b610d26565b60405161028391906128fc565b34801561062657600080fd5b5061063a610635366004612976565b610e0d565b60408051921515835263ffffffff909116602083015201610283565b34801561066257600080fd5b506102296106713660046126d5565b610e94565b34801561068257600080fd5b50620697806102ac565b34801561069857600080fd5b5061063a6106a73660046126d5565b610ed7565b3480156106b857600080fd5b506102296106c73660046129c1565b610f54565b3480156106d857600080fd5b506102ac6106e7366004612833565b610f66565b3480156106f857600080fd5b5061070c6107073660046129df565b6110c0565b6040516001600160a01b039091168152602001610283565b34801561073057600080fd5b5061074461073f366004612a09565b6110e2565b6040805192835263ffffffff909116602083015201610283565b34801561076a57600080fd5b506105df610779366004612560565b611227565b34801561078a57600080fd5b506102296107993660046126d5565b611248565b6107a6611271565b60005b828110156107ea576107e2858585848181106107c7576107c7612a7b565b90506020020160208101906107dc9190612a91565b846112ec565b6001016107a9565b5050505050565b6001600160401b03811660009081526001602081905260408220015461082690600160801b90046001600160701b031661136e565b92915050565b610834611271565b61083e828261138d565b5050565b61084a611271565b604051637a9e5e4b60e01b81526001600160a01b038281166004830152831690637a9e5e4b90602401600060405180830381600087803b15801561088d57600080fd5b505af11580156108a1573d6000803e3d6000fd5b505050505050565b60003381806108ba838888886113ff565b91509150811580156108d0575063ffffffff8116155b156109235782876108e18888611452565b6040516381c6f24b60e01b81526001600160a01b0393841660048201529290911660248301526001600160e01b03191660448201526064015b60405180910390fd5b600061093184898989610ced565b9050600063ffffffff8316151580610958575061094d82610a9e565b65ffffffffffff1615155b15610969576109668261146a565b90505b60035461097f8a61097a8b8b611452565b61156a565b6003819055506109c78a8a8a8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152503492506115ac915050565b506003559450505050505b9392505050565b6109e1611271565b60006109f784846109f1876107f1565b85611650565b90508015610a21576001600160401b03841660009081526004602052604090206107ea908461189b565b50505050565b6001600160401b03821660009081526001602090815260408083206001600160a01b03851684529091528120805465ffffffffffff811692918291829190610a7e90600160301b90046001600160701b03166118b0565b969991985096509350505050565b610a94611271565b61083e82826118d3565b60008181526002602052604081205465ffffffffffff16610abe81611977565b610ac857806109d2565b60009392505050565b6001600160a01b038116600090815260208190526040812060010154610826906001600160701b031661136e565b610b07611271565b61083e82826119a6565b6001600160a01b0382166000908152602081815260408083206001600160e01b0319851684529091529020546001600160401b031692915050565b610b54611271565b6001600160401b0383161580610b7257506001600160401b03838116145b15610b9b5760405163061c6a4360e21b81526001600160401b038416600482015260240161091a565b826001600160401b03167f1256f5b5ecb89caec12db449738f2fbcd1ba5806cf38f35413f4e5c15bf6a4508383604051610bd6929190612ad7565b60405180910390a2505050565b60408051638fb3603760e01b80825291513392918391638fb36037916004808201926020929091908290030181865afa158015610c24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c489190612af3565b6001600160e01b03191614610c7b57604051630641fee960e31b81526001600160a01b038216600482015260240161091a565b6107ea610c8a85838686610ced565b61146a565b6001600160a01b0316600090815260208190526040902060010154600160701b900460ff1690565b6001600160401b038116600090815260046020526040902060609061082690611a58565b610ce3611271565b61083e8282611a65565b600084848484604051602001610d069493929190612b10565b604051602081830303815290604052805190602001209050949350505050565b604080516000815260208101909152606090826001600160401b03811115610d5057610d50612b90565b604051908082528060200260200182016040528015610d8357816020015b6060815260200190600190039081610d6e5790505b50915060005b83811015610e0557610de030868684818110610da757610da7612a7b565b9050602002810190610db99190612ba6565b85604051602001610dcc93929190612bec565b604051602081830303815290604052611b76565b838281518110610df257610df2612a7b565b6020908102919091010152600101610d89565b505092915050565b600080610e1984610c8f565b15610e2957506000905080610e8c565b306001600160a01b03861603610e4e57610e438484611bec565b600091509150610e8c565b6000610e5a8585610b11565b9050600080610e698389610ed7565b9150915081610e7a57600080610e84565b63ffffffff811615815b945094505050505b935093915050565b610e9c611271565b6000610ea88383611c03565b90508015610ed2576001600160401b0383166000908152600460205260409020610a219083611cf0565b505050565b60008067fffffffffffffffe196001600160401b03851601610eff5750600190506000610f4d565b600080610f0c8686610a27565b5050915091508165ffffffffffff16600014158015610f425750610f2e611d05565b65ffffffffffff168265ffffffffffff1611155b93509150610f4d9050565b9250929050565b610f5c611271565b61083e8282611d15565b60003381610f748585611452565b90506000610f8488888888610ced565b60008181526002602052604081205491925065ffffffffffff9091169003610fc25760405163060a299b60e41b81526004810182905260240161091a565b826001600160a01b0316886001600160a01b03161461105e576000610fe8600085610ed7565b5090506000611003610ffd6102468b87610b11565b86610ed7565b50905081158015611012575080155b1561105b57604051630ff89d4760e21b81526001600160a01b038087166004830152808c1660248301528a1660448201526001600160e01b03198516606482015260840161091a565b50505b600081815260026020526040808220805465ffffffffffff1916908190559051600160301b90910463ffffffff1691829184917fbd9ac67a6e2f6463b80927326310338bcbb4bdb7936ce1365ea3e01067e7b9f791a398975050505050505050565b6001600160401b03821660009081526004602052604081206109d29083611dd2565b60008033816110f3828989896113ff565b91505060008163ffffffff16611107611d05565b6111119190612c13565b905063ffffffff82161580611148575060008665ffffffffffff1611801561114857508065ffffffffffff168665ffffffffffff16105b156111595782896108e18a8a611452565b6111738665ffffffffffff168265ffffffffffff16611dde565b9550611181838a8a8a610ced565b945061118c85611dee565b60008581526002602052604090819020805465ffffffffffff891669ffffffffffffffffffff19821617600160301b9182900463ffffffff90811660010190811692830291909117909255915190955086907f82a2da5dee54ea8021c6545b4444620291e07ee83be6dd57edb175062715f3b490611213908a9088908f908f908f90612c32565b60405180910390a350505094509492505050565b6001600160401b038116600090815260046020526040812061082690611e3b565b6001600160a01b0381163314610e9c57604051635f159e6360e01b815260040160405180910390fd5b33600080611280838236611e45565b9150915081610ed2578063ffffffff166000036112dc5760006112a38136611f0f565b5060405163f07e038f60e01b81526001600160a01b03871660048201526001600160401b0382166024820152909250604401905061091a565b610a21610c8a8430600036610ced565b6001600160a01b0383166000818152602081815260408083206001600160e01b0319871680855290835292819020805467ffffffffffffffff19166001600160401b038716908117909155905192835292917f9ea6790c7dadfd01c9f8b9762b3682607af2c7e79e05a9f9fdf5580dde949151910160405180910390a3505050565b600080611383836001600160701b03166118b0565b5090949350505050565b6001600160a01b038216600081815260208190526040908190206001018054841515600160701b0260ff60701b19909116179055517f90d4e7bb7e5d933792b3562e1741306f8be94837e1348dacef9b6f1df56eb138906113f390841515815260200190565b60405180910390a25050565b600080306001600160a01b038616036114265761141d868585611e45565b91509150611449565b600483106114425761143d86866106358787611452565b61141d565b5060009050805b94509492505050565b60006114616004828486612b66565b6109d291612c78565b60008181526002602052604081205465ffffffffffff811690600160301b900463ffffffff168183036114b35760405163060a299b60e41b81526004810185905260240161091a565b6114bb611d05565b65ffffffffffff168265ffffffffffff1611156114ee57604051630c65b5bd60e11b81526004810185905260240161091a565b6114f782611977565b1561151857604051631e2975b960e21b81526004810185905260240161091a565b600084815260026020526040808220805465ffffffffffff191690555163ffffffff83169186917f76a2a46953689d4861a5d3f6ed883ad7e6af674a21f8e162707159fc9dde614d9190a39392505050565b604080516001600160a01b03939093166020808501919091526001600160e01b0319929092168382015280518084038201815260609093019052815191012090565b6060814710156115d85760405163cf47918160e01b81524760048201526024810183905260440161091a565b600080856001600160a01b031684866040516115f49190612ca6565b60006040518083038185875af1925050503d8060008114611631576040519150601f19603f3d011682016040523d82523d6000602084013e611636565b606091505b5091509150611646868383612101565b9695505050505050565b600067fffffffffffffffe196001600160401b0386160161168f5760405163061c6a4360e21b81526001600160401b038616600482015260240161091a565b6001600160401b03851660009081526001602090815260408083206001600160a01b038816845290915281205465ffffffffffff1615908115611781578463ffffffff166116db611d05565b6116e59190612c13565b905060405180604001604052808265ffffffffffff1681526020016117138663ffffffff1663ffffffff1690565b6001600160701b039081169091526001600160401b03891660009081526001602090815260408083206001600160a01b038c1684528252909120835181549490920151909216600160301b026001600160a01b031990931665ffffffffffff9091161791909117905561182d565b6001600160401b03871660009081526001602090815260408083206001600160a01b038a1684529091528120546117cb91600160301b9091046001600160701b031690869061215d565b6001600160401b03891660009081526001602090815260408083206001600160a01b038c168452909152902080546001600160701b03909316600160301b0273ffffffffffffffffffffffffffff000000000000199093169290921790915590505b6040805163ffffffff8616815265ffffffffffff831660208201528315158183015290516001600160a01b038816916001600160401b038a16917ff98448b987f1428e0e230e1f3c6e2ce15b5693eaf31827fbd0b1ec4b424ae7cf9181900360600190a35095945050505050565b60006109d2836001600160a01b038416612207565b60008060006118c6846118c1611d05565b612256565b9250925092509193909250565b6001600160401b03821615806118f157506001600160401b03828116145b1561191a5760405163061c6a4360e21b81526001600160401b038316600482015260240161091a565b6001600160401b038281166000818152600160208190526040808320909101805467ffffffffffffffff19169486169485179055517f1fd6dd7631312dfac2205b52913f99de03b4d7e381d5d27d3dbfe0713e6e63409190a35050565b6000611981611d05565b65ffffffffffff1661199662093a8084612c13565b65ffffffffffff16111592915050565b6001600160401b03821615806119c457506001600160401b03828116145b156119ed5760405163061c6a4360e21b81526001600160401b038316600482015260240161091a565b6001600160401b03828116600081815260016020819052604080832090910180546fffffffffffffffff00000000000000001916600160401b958716958602179055517f7a8059630b897b5de4c08ade69f8b90c3ead1f8596d62d10b6c4d14a0afb4ae29190a35050565b606060006109d2836122a3565b67fffffffffffffffe196001600160401b03831601611aa25760405163061c6a4360e21b81526001600160401b038316600482015260240161091a565b6001600160401b038216600090815260016020819052604082200154611adc90600160801b90046001600160701b0316836206978061215d565b6001600160401b0385166000818152600160208190526040918290200180546001600160701b03909516600160801b026dffffffffffffffffffffffffffff60801b199095169490941790935591519092507ffeb69018ee8b8fd50ea86348f1267d07673379f72cffdeccec63853ee8ce8b4890610bd6908590859063ffffffff92909216825265ffffffffffff16602082015260400190565b6060600080846001600160a01b031684604051611b939190612ca6565b600060405180830381855af49150503d8060008114611bce576040519150601f19603f3d011682016040523d82523d6000602084013e611bd3565b606091505b5091509150611be3858383612101565b95945050505050565b6000611bf8838361156a565b600354149392505050565b600067fffffffffffffffe196001600160401b03841601611c425760405163061c6a4360e21b81526001600160401b038416600482015260240161091a565b6001600160401b03831660009081526001602090815260408083206001600160a01b038616845290915281205465ffffffffffff169003611c8557506000610826565b6001600160401b03831660008181526001602090815260408083206001600160a01b038716808552925280832080546001600160a01b0319169055519092917ff229baa593af28c41b1d16b748cd7688f0c83aaf92d4be41c44005defe84c16691a350600192915050565b60006109d2836001600160a01b0384166122ff565b6000611d10426123f9565b905090565b6001600160a01b038216600090815260208190526040812060010154611d48906001600160701b0316836206978061215d565b6001600160a01b0385166000818152602081815260409182902060010180546dffffffffffffffffffffffffffff19166001600160701b039690961695909517909455805163ffffffff8716815265ffffffffffff841694810194909452919350917fa56b76017453f399ec2327ba00375dbfb1fd070ff854341ad6191e6a2e2de19c9101610bd6565b60006109d28383612430565b60008282188284110282186109d2565b60008181526002602052604090205465ffffffffffff168015801590611e1a5750611e1881611977565b155b1561083e5760405163813e945960e01b81526004810183905260240161091a565b6000610826825490565b6000806004831015611e5c57506000905080610e8c565b306001600160a01b03861603611e7f57610e4330611e7a8686611452565b611bec565b6000806000611e8e8787611f0f565b92509250925082158015611ea65750611ea630610c8f565b15611eba5760008094509450505050610e8c565b600080611ec7848b610ed7565b9150915081611ee157600080965096505050505050610e8c565b611ef78363ffffffff168263ffffffff16611dde565b63ffffffff8116159b909a5098505050505050505050565b600080806004841015611f2a575060009150819050806120fa565b6000611f368686611452565b90506001600160e01b031981166310a6aa3760e31b1480611f6757506001600160e01b031981166330cae18760e01b145b80611f8257506001600160e01b0319811663294b14a960e11b145b80611f9d57506001600160e01b03198116635326cae760e11b145b80611fb857506001600160e01b0319811663d22b598960e01b145b15611fce576001600080935093509350506120fa565b6001600160e01b0319811663063fc60f60e21b1480611ffd57506001600160e01b0319811663167bd39560e01b145b8061201857506001600160e01b031981166308d6122d60e01b145b1561205a57600061202d60246004888a612b66565b81019061203a919061273d565b9050600061204782610ad1565b600196506000955093506120fa92505050565b6001600160e01b0319811663012e238d60e51b148061208957506001600160e01b03198116635be958b160e11b145b156120e457600061209e60246004888a612b66565b8101906120ab9190612560565b905060016120d5826001600160401b03908116600090815260016020819052604090912001541690565b600094509450945050506120fa565b60006120f03083610b11565b6000935093509350505b9250925092565b606082612116576121118261245a565b6109d2565b815115801561212d57506001600160a01b0384163b155b1561215657604051639996b31560e01b81526001600160a01b038516600482015260240161091a565b50806109d2565b6000806000612174866001600160701b031661136e565b905060006121b18563ffffffff168763ffffffff168463ffffffff161161219c5760006121a6565b6121a68885612cc2565b63ffffffff16611dde565b90508063ffffffff166121c2611d05565b6121cc9190612c13565b925063ffffffff8616602083901b67ffffffff0000000016604085901b6dffffffffffff000000000000000016171793505050935093915050565b600081815260018301602052604081205461224e57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610826565b506000610826565b69ffffffffffffffffffff602083901c166001600160701b03831665ffffffffffff604085901c811690841681111561229157828282612296565b816000805b9250925092509250925092565b6060816000018054806020026020016040519081016040528092919081815260200182805480156122f357602002820191906000526020600020905b8154815260200190600101908083116122df575b50505050509050919050565b600081815260018301602052604081205480156123e8576000612323600183612b53565b855490915060009061233790600190612b53565b905080821461239c57600086600001828154811061235757612357612a7b565b906000526020600020015490508087600001848154811061237a5761237a612a7b565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806123ad576123ad612cdf565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610826565b6000915050610826565b5092915050565b600065ffffffffffff82111561242c576040516306dfcc6560e41b8152603060048201526024810183905260440161091a565b5090565b600082600001828154811061244757612447612a7b565b9060005260206000200154905092915050565b80511561246957805160208201fd5b60405163d6bda27560e01b815260040160405180910390fd5b50565b6001600160a01b038116811461248257600080fd5b60008083601f8401126124ac57600080fd5b5081356001600160401b038111156124c357600080fd5b6020830191508360208260051b8501011115610f4d57600080fd5b80356001600160401b03811681146124f557600080fd5b919050565b6000806000806060858703121561251057600080fd5b843561251b81612485565b935060208501356001600160401b0381111561253657600080fd5b6125428782880161249a565b90945092506125559050604086016124de565b905092959194509250565b60006020828403121561257257600080fd5b6109d2826124de565b6000806040838503121561258e57600080fd5b823561259981612485565b9150602083013580151581146125ae57600080fd5b809150509250929050565b600080604083850312156125cc57600080fd5b82356125d781612485565b915060208301356125ae81612485565b60008083601f8401126125f957600080fd5b5081356001600160401b0381111561261057600080fd5b602083019150836020828501011115610f4d57600080fd5b60008060006040848603121561263d57600080fd5b833561264881612485565b925060208401356001600160401b0381111561266357600080fd5b61266f868287016125e7565b9497909650939450505050565b803563ffffffff811681146124f557600080fd5b6000806000606084860312156126a557600080fd5b6126ae846124de565b925060208401356126be81612485565b91506126cc6040850161267c565b90509250925092565b600080604083850312156126e857600080fd5b6125d7836124de565b6000806040838503121561270457600080fd5b61270d836124de565b915061271b602084016124de565b90509250929050565b60006020828403121561273657600080fd5b5035919050565b60006020828403121561274f57600080fd5b81356109d281612485565b6001600160e01b03198116811461248257600080fd5b6000806040838503121561278357600080fd5b823561278e81612485565b915060208301356125ae8161275a565b6000806000604084860312156127b357600080fd5b612648846124de565b6020808252825182820181905260009190848201906040850190845b818110156127fd5783516001600160a01b0316835292840192918401916001016127d8565b50909695505050505050565b6000806040838503121561281c57600080fd5b612825836124de565b915061271b6020840161267c565b6000806000806060858703121561284957600080fd5b843561285481612485565b9350602085013561286481612485565b925060408501356001600160401b0381111561287f57600080fd5b61288b878288016125e7565b95989497509550505050565b600080602083850312156128aa57600080fd5b82356001600160401b038111156128c057600080fd5b6128cc8582860161249a565b90969095509350505050565b60005b838110156128f35781810151838201526020016128db565b50506000910152565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561296957878503603f190184528151805180875261294a818989018a85016128d8565b601f01601f191695909501860194509285019290850190600101612923565b5092979650505050505050565b60008060006060848603121561298b57600080fd5b833561299681612485565b925060208401356129a681612485565b915060408401356129b68161275a565b809150509250925092565b600080604083850312156129d457600080fd5b823561282581612485565b600080604083850312156129f257600080fd5b6129fb836124de565b946020939093013593505050565b60008060008060608587031215612a1f57600080fd5b8435612a2a81612485565b935060208501356001600160401b03811115612a4557600080fd5b612a51878288016125e7565b909450925050604085013565ffffffffffff81168114612a7057600080fd5b939692955090935050565b634e487b7160e01b600052603260045260246000fd5b600060208284031215612aa357600080fd5b81356109d28161275a565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b602081526000612aeb602083018486612aae565b949350505050565b600060208284031215612b0557600080fd5b81516109d28161275a565b6001600160a01b038581168252841660208201526060604082018190526000906116469083018486612aae565b634e487b7160e01b600052601160045260246000fd5b8181038181111561082657610826612b3d565b60008085851115612b7657600080fd5b83861115612b8357600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000808335601e19843603018112612bbd57600080fd5b8301803591506001600160401b03821115612bd757600080fd5b602001915036819003821315610f4d57600080fd5b828482376000838201600081528351612c098183602088016128d8565b0195945050505050565b65ffffffffffff8181168382160190808211156123f2576123f2612b3d565b65ffffffffffff861681526001600160a01b03858116602083015284166040820152608060608201819052600090612c6d9083018486612aae565b979650505050505050565b6001600160e01b03198135818116916004851015610e055760049490940360031b84901b1690921692915050565b60008251612cb88184602087016128d8565b9190910192915050565b63ffffffff8281168282160390808211156123f2576123f2612b3d565b634e487b7160e01b600052603160045260246000fdfea264697066735822122082b7987ba44be1d04aac83a74292b30bc191863fff65197a8cffa32e6e47ab1464736f6c63430008180033",
1233
+ "bytecode": "0x608060405234801561001057600080fd5b506040516132b73803806132b783398101604081905261002f916104f4565b806001600160a01b03811661005f57604051630409d6d160e11b8152600060048201526024015b60405180910390fd5b61006c60008281806100a8565b50506000805260046020526100a17f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ec826102f3565b505061057d565b60006002600160401b03196001600160401b038616016100e65760405163061c6a4360e21b81526001600160401b0386166004820152602401610056565b6001600160401b03851660009081526001602090815260408083206001600160a01b038816845290915281205465ffffffffffff16159081156101dd5763ffffffff8516610132610311565b61013c919061053a565b905060405180604001604052808265ffffffffffff16815260200161016c8663ffffffff1661032160201b60201c565b6001600160701b039081169091526001600160401b03891660009081526001602090815260408083206001600160a01b038c16845282529091208351815494909201519092166601000000000000026001600160a01b031990931665ffffffffffff90911617919091179055610285565b6001600160401b03871660009081526001602090815260408083206001600160a01b038a16845290915281205461022a9166010000000000009091046001600160701b031690869061032a565b6001600160401b03891660009081526001602090815260408083206001600160a01b038c168452909152902080546001600160701b03909316660100000000000002600160301b600160a01b03199093169290921790915590505b6040805163ffffffff8616815265ffffffffffff831660208201528315158183015290516001600160a01b038816916001600160401b038a16917ff98448b987f1428e0e230e1f3c6e2ce15b5693eaf31827fbd0b1ec4b424ae7cf9181900360600190a35095945050505050565b6000610308836001600160a01b0384166103d3565b90505b92915050565b600061031c42610422565b905090565b63ffffffff1690565b600080806103406001600160701b038716610459565b9050600061037d8563ffffffff168763ffffffff168463ffffffff1611610368576000610372565b6103728885610560565b63ffffffff16610478565b905063ffffffff811661038e610311565b610398919061053a565b925063ffffffff8616602083901b67ffffffff0000000016604085901b6dffffffffffff000000000000000016171793505050935093915050565b600081815260018301602052604081205461041a5750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561030b565b50600061030b565b600065ffffffffffff821115610455576040516306dfcc6560e41b81526030600482015260248101839052604401610056565b5090565b60008061046e6001600160701b038416610488565b5090949350505050565b6000828218828411028218610308565b6000808061049d84610498610311565b6104aa565b9250925092509193909250565b6001600160501b03602083901c166001600160701b03831665ffffffffffff604085901c81169084168111156104e2578282826104e7565b816000805b9250925092509250925092565b60006020828403121561050657600080fd5b81516001600160a01b038116811461051d57600080fd5b9392505050565b634e487b7160e01b600052601160045260246000fd5b65ffffffffffff81811683821601908082111561055957610559610524565b5092915050565b63ffffffff82811682821603908082111561055957610559610524565b612d2b8061058c6000396000f3fe6080604052600436106102045760003560e01c806375b238fc11610118578063b7d2b162116100a0578063d6bb62c61161006f578063d6bb62c6146106cc578063d78a83b1146106ec578063f801a69814610724578063fc8610d11461075e578063fe0776f51461077e57600080fd5b8063b7d2b16214610656578063cc1b6c8114610676578063d1f856ee1461068c578063d22b5989146106ac57600080fd5b8063a5808e2f116100e7578063a5808e2f14610572578063a64d95ce1461059f578063abd9bd2a146105bf578063ac9650d8146105ed578063b70096131461061a57600080fd5b806375b238fc146104ed578063853551b81461050257806394c7d7ee14610522578063a166aa891461054257600080fd5b806330cae1871161019b5780634665096d1161016a5780634665096d1461043a5780634c1da1e2146104505780635296295214610470578063530dd456146104905780636d5115bd146104cd57600080fd5b806330cae1871461038e5780633adc277a146103ae5780633ca7c02a146103e55780634136a33c1461040057600080fd5b806318ff183c116101d757806318ff183c146102e15780631cff79cd1461030157806325c471a0146103145780633078f1141461033457600080fd5b806308d6122d146102095780630b0a93ba1461022b57806312be87271461028c578063167bd395146102c1575b600080fd5b34801561021557600080fd5b506102296102243660046124fa565b61079e565b005b34801561023757600080fd5b5061026f610246366004612560565b6001600160401b0390811660009081526001602081905260409091200154600160401b90041690565b6040516001600160401b0390911681526020015b60405180910390f35b34801561029857600080fd5b506102ac6102a7366004612560565b6107f1565b60405163ffffffff9091168152602001610283565b3480156102cd57600080fd5b506102296102dc36600461257b565b61082c565b3480156102ed57600080fd5b506102296102fc3660046125b9565b610842565b6102ac61030f366004612628565b6108a9565b34801561032057600080fd5b5061022961032f366004612690565b6109d9565b34801561034057600080fd5b5061035461034f3660046126d5565b610a27565b604051610283949392919065ffffffffffff948516815263ffffffff93841660208201529190921660408201529116606082015260800190565b34801561039a57600080fd5b506102296103a93660046126f1565b610a8c565b3480156103ba57600080fd5b506103ce6103c9366004612724565b610a9e565b60405165ffffffffffff9091168152602001610283565b3480156103f157600080fd5b5061026f6001600160401b0381565b34801561040c57600080fd5b506102ac61041b366004612724565b600090815260026020526040902054600160301b900463ffffffff1690565b34801561044657600080fd5b5062093a806102ac565b34801561045c57600080fd5b506102ac61046b36600461273d565b610ad1565b34801561047c57600080fd5b5061022961048b3660046126f1565b610aff565b34801561049c57600080fd5b5061026f6104ab366004612560565b6001600160401b03908116600090815260016020819052604090912001541690565b3480156104d957600080fd5b5061026f6104e8366004612770565b610b11565b3480156104f957600080fd5b5061026f600081565b34801561050e57600080fd5b5061022961051d36600461279e565b610b4c565b34801561052e57600080fd5b5061022961053d366004612628565b610be3565b34801561054e57600080fd5b5061056261055d36600461273d565b610c8f565b6040519015158152602001610283565b34801561057e57600080fd5b5061059261058d366004612560565b610cb7565b60405161028391906127bc565b3480156105ab57600080fd5b506102296105ba366004612809565b610cdb565b3480156105cb57600080fd5b506105df6105da366004612833565b610ced565b604051908152602001610283565b3480156105f957600080fd5b5061060d610608366004612897565b610d26565b60405161028391906128fc565b34801561062657600080fd5b5061063a610635366004612976565b610e0d565b60408051921515835263ffffffff909116602083015201610283565b34801561066257600080fd5b506102296106713660046126d5565b610e94565b34801561068257600080fd5b50620697806102ac565b34801561069857600080fd5b5061063a6106a73660046126d5565b610ed7565b3480156106b857600080fd5b506102296106c73660046129c1565b610f54565b3480156106d857600080fd5b506102ac6106e7366004612833565b610f66565b3480156106f857600080fd5b5061070c6107073660046129df565b6110c0565b6040516001600160a01b039091168152602001610283565b34801561073057600080fd5b5061074461073f366004612a09565b6110e2565b6040805192835263ffffffff909116602083015201610283565b34801561076a57600080fd5b506105df610779366004612560565b611227565b34801561078a57600080fd5b506102296107993660046126d5565b611248565b6107a6611271565b60005b828110156107ea576107e2858585848181106107c7576107c7612a7b565b90506020020160208101906107dc9190612a91565b846112ec565b6001016107a9565b5050505050565b6001600160401b03811660009081526001602081905260408220015461082690600160801b90046001600160701b031661136e565b92915050565b610834611271565b61083e828261138d565b5050565b61084a611271565b604051637a9e5e4b60e01b81526001600160a01b038281166004830152831690637a9e5e4b90602401600060405180830381600087803b15801561088d57600080fd5b505af11580156108a1573d6000803e3d6000fd5b505050505050565b60003381806108ba838888886113ff565b91509150811580156108d0575063ffffffff8116155b156109235782876108e18888611452565b6040516381c6f24b60e01b81526001600160a01b0393841660048201529290911660248301526001600160e01b03191660448201526064015b60405180910390fd5b600061093184898989610ced565b9050600063ffffffff8316151580610958575061094d82610a9e565b65ffffffffffff1615155b15610969576109668261146a565b90505b60035461097f8a61097a8b8b611452565b61156a565b6003819055506109c78a8a8a8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152503492506115ac915050565b506003559450505050505b9392505050565b6109e1611271565b60006109f784846109f1876107f1565b85611650565b90508015610a21576001600160401b03841660009081526004602052604090206107ea908461189b565b50505050565b6001600160401b03821660009081526001602090815260408083206001600160a01b03851684529091528120805465ffffffffffff811692918291829190610a7e90600160301b90046001600160701b03166118b0565b969991985096509350505050565b610a94611271565b61083e82826118d3565b60008181526002602052604081205465ffffffffffff16610abe81611977565b610ac857806109d2565b60009392505050565b6001600160a01b038116600090815260208190526040812060010154610826906001600160701b031661136e565b610b07611271565b61083e82826119a6565b6001600160a01b0382166000908152602081815260408083206001600160e01b0319851684529091529020546001600160401b031692915050565b610b54611271565b6001600160401b0383161580610b7257506001600160401b03838116145b15610b9b5760405163061c6a4360e21b81526001600160401b038416600482015260240161091a565b826001600160401b03167f1256f5b5ecb89caec12db449738f2fbcd1ba5806cf38f35413f4e5c15bf6a4508383604051610bd6929190612ad7565b60405180910390a2505050565b60408051638fb3603760e01b80825291513392918391638fb36037916004808201926020929091908290030181865afa158015610c24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c489190612af3565b6001600160e01b03191614610c7b57604051630641fee960e31b81526001600160a01b038216600482015260240161091a565b6107ea610c8a85838686610ced565b61146a565b6001600160a01b0316600090815260208190526040902060010154600160701b900460ff1690565b6001600160401b038116600090815260046020526040902060609061082690611a58565b610ce3611271565b61083e8282611a65565b600084848484604051602001610d069493929190612b10565b604051602081830303815290604052805190602001209050949350505050565b604080516000815260208101909152606090826001600160401b03811115610d5057610d50612b90565b604051908082528060200260200182016040528015610d8357816020015b6060815260200190600190039081610d6e5790505b50915060005b83811015610e0557610de030868684818110610da757610da7612a7b565b9050602002810190610db99190612ba6565b85604051602001610dcc93929190612bec565b604051602081830303815290604052611b76565b838281518110610df257610df2612a7b565b6020908102919091010152600101610d89565b505092915050565b600080610e1984610c8f565b15610e2957506000905080610e8c565b306001600160a01b03861603610e4e57610e438484611bec565b600091509150610e8c565b6000610e5a8585610b11565b9050600080610e698389610ed7565b9150915081610e7a57600080610e84565b63ffffffff811615815b945094505050505b935093915050565b610e9c611271565b6000610ea88383611c03565b90508015610ed2576001600160401b0383166000908152600460205260409020610a219083611cf0565b505050565b60008067fffffffffffffffe196001600160401b03851601610eff5750600190506000610f4d565b600080610f0c8686610a27565b5050915091508165ffffffffffff16600014158015610f425750610f2e611d05565b65ffffffffffff168265ffffffffffff1611155b93509150610f4d9050565b9250929050565b610f5c611271565b61083e8282611d15565b60003381610f748585611452565b90506000610f8488888888610ced565b60008181526002602052604081205491925065ffffffffffff9091169003610fc25760405163060a299b60e41b81526004810182905260240161091a565b826001600160a01b0316886001600160a01b03161461105e576000610fe8600085610ed7565b5090506000611003610ffd6102468b87610b11565b86610ed7565b50905081158015611012575080155b1561105b57604051630ff89d4760e21b81526001600160a01b038087166004830152808c1660248301528a1660448201526001600160e01b03198516606482015260840161091a565b50505b600081815260026020526040808220805465ffffffffffff1916908190559051600160301b90910463ffffffff1691829184917fbd9ac67a6e2f6463b80927326310338bcbb4bdb7936ce1365ea3e01067e7b9f791a398975050505050505050565b6001600160401b03821660009081526004602052604081206109d29083611dd2565b60008033816110f3828989896113ff565b91505060008163ffffffff16611107611d05565b6111119190612c13565b905063ffffffff82161580611148575060008665ffffffffffff1611801561114857508065ffffffffffff168665ffffffffffff16105b156111595782896108e18a8a611452565b6111738665ffffffffffff168265ffffffffffff16611dde565b9550611181838a8a8a610ced565b945061118c85611dee565b60008581526002602052604090819020805465ffffffffffff891669ffffffffffffffffffff19821617600160301b9182900463ffffffff90811660010190811692830291909117909255915190955086907f82a2da5dee54ea8021c6545b4444620291e07ee83be6dd57edb175062715f3b490611213908a9088908f908f908f90612c32565b60405180910390a350505094509492505050565b6001600160401b038116600090815260046020526040812061082690611e3b565b6001600160a01b0381163314610e9c57604051635f159e6360e01b815260040160405180910390fd5b33600080611280838236611e45565b9150915081610ed2578063ffffffff166000036112dc5760006112a38136611f0f565b5060405163f07e038f60e01b81526001600160a01b03871660048201526001600160401b0382166024820152909250604401905061091a565b610a21610c8a8430600036610ced565b6001600160a01b0383166000818152602081815260408083206001600160e01b0319871680855290835292819020805467ffffffffffffffff19166001600160401b038716908117909155905192835292917f9ea6790c7dadfd01c9f8b9762b3682607af2c7e79e05a9f9fdf5580dde949151910160405180910390a3505050565b600080611383836001600160701b03166118b0565b5090949350505050565b6001600160a01b038216600081815260208190526040908190206001018054841515600160701b0260ff60701b19909116179055517f90d4e7bb7e5d933792b3562e1741306f8be94837e1348dacef9b6f1df56eb138906113f390841515815260200190565b60405180910390a25050565b600080306001600160a01b038616036114265761141d868585611e45565b91509150611449565b600483106114425761143d86866106358787611452565b61141d565b5060009050805b94509492505050565b60006114616004828486612b66565b6109d291612c78565b60008181526002602052604081205465ffffffffffff811690600160301b900463ffffffff168183036114b35760405163060a299b60e41b81526004810185905260240161091a565b6114bb611d05565b65ffffffffffff168265ffffffffffff1611156114ee57604051630c65b5bd60e11b81526004810185905260240161091a565b6114f782611977565b1561151857604051631e2975b960e21b81526004810185905260240161091a565b600084815260026020526040808220805465ffffffffffff191690555163ffffffff83169186917f76a2a46953689d4861a5d3f6ed883ad7e6af674a21f8e162707159fc9dde614d9190a39392505050565b604080516001600160a01b03939093166020808501919091526001600160e01b0319929092168382015280518084038201815260609093019052815191012090565b6060814710156115d85760405163cf47918160e01b81524760048201526024810183905260440161091a565b600080856001600160a01b031684866040516115f49190612ca6565b60006040518083038185875af1925050503d8060008114611631576040519150601f19603f3d011682016040523d82523d6000602084013e611636565b606091505b5091509150611646868383612101565b9695505050505050565b600067fffffffffffffffe196001600160401b0386160161168f5760405163061c6a4360e21b81526001600160401b038616600482015260240161091a565b6001600160401b03851660009081526001602090815260408083206001600160a01b038816845290915281205465ffffffffffff1615908115611781578463ffffffff166116db611d05565b6116e59190612c13565b905060405180604001604052808265ffffffffffff1681526020016117138663ffffffff1663ffffffff1690565b6001600160701b039081169091526001600160401b03891660009081526001602090815260408083206001600160a01b038c1684528252909120835181549490920151909216600160301b026001600160a01b031990931665ffffffffffff9091161791909117905561182d565b6001600160401b03871660009081526001602090815260408083206001600160a01b038a1684529091528120546117cb91600160301b9091046001600160701b031690869061215d565b6001600160401b03891660009081526001602090815260408083206001600160a01b038c168452909152902080546001600160701b03909316600160301b0273ffffffffffffffffffffffffffff000000000000199093169290921790915590505b6040805163ffffffff8616815265ffffffffffff831660208201528315158183015290516001600160a01b038816916001600160401b038a16917ff98448b987f1428e0e230e1f3c6e2ce15b5693eaf31827fbd0b1ec4b424ae7cf9181900360600190a35095945050505050565b60006109d2836001600160a01b038416612207565b60008060006118c6846118c1611d05565b612256565b9250925092509193909250565b6001600160401b03821615806118f157506001600160401b03828116145b1561191a5760405163061c6a4360e21b81526001600160401b038316600482015260240161091a565b6001600160401b038281166000818152600160208190526040808320909101805467ffffffffffffffff19169486169485179055517f1fd6dd7631312dfac2205b52913f99de03b4d7e381d5d27d3dbfe0713e6e63409190a35050565b6000611981611d05565b65ffffffffffff1661199662093a8084612c13565b65ffffffffffff16111592915050565b6001600160401b03821615806119c457506001600160401b03828116145b156119ed5760405163061c6a4360e21b81526001600160401b038316600482015260240161091a565b6001600160401b03828116600081815260016020819052604080832090910180546fffffffffffffffff00000000000000001916600160401b958716958602179055517f7a8059630b897b5de4c08ade69f8b90c3ead1f8596d62d10b6c4d14a0afb4ae29190a35050565b606060006109d2836122a3565b67fffffffffffffffe196001600160401b03831601611aa25760405163061c6a4360e21b81526001600160401b038316600482015260240161091a565b6001600160401b038216600090815260016020819052604082200154611adc90600160801b90046001600160701b0316836206978061215d565b6001600160401b0385166000818152600160208190526040918290200180546001600160701b03909516600160801b026dffffffffffffffffffffffffffff60801b199095169490941790935591519092507ffeb69018ee8b8fd50ea86348f1267d07673379f72cffdeccec63853ee8ce8b4890610bd6908590859063ffffffff92909216825265ffffffffffff16602082015260400190565b6060600080846001600160a01b031684604051611b939190612ca6565b600060405180830381855af49150503d8060008114611bce576040519150601f19603f3d011682016040523d82523d6000602084013e611bd3565b606091505b5091509150611be3858383612101565b95945050505050565b6000611bf8838361156a565b600354149392505050565b600067fffffffffffffffe196001600160401b03841601611c425760405163061c6a4360e21b81526001600160401b038416600482015260240161091a565b6001600160401b03831660009081526001602090815260408083206001600160a01b038616845290915281205465ffffffffffff169003611c8557506000610826565b6001600160401b03831660008181526001602090815260408083206001600160a01b038716808552925280832080546001600160a01b0319169055519092917ff229baa593af28c41b1d16b748cd7688f0c83aaf92d4be41c44005defe84c16691a350600192915050565b60006109d2836001600160a01b0384166122ff565b6000611d10426123f9565b905090565b6001600160a01b038216600090815260208190526040812060010154611d48906001600160701b0316836206978061215d565b6001600160a01b0385166000818152602081815260409182902060010180546dffffffffffffffffffffffffffff19166001600160701b039690961695909517909455805163ffffffff8716815265ffffffffffff841694810194909452919350917fa56b76017453f399ec2327ba00375dbfb1fd070ff854341ad6191e6a2e2de19c9101610bd6565b60006109d28383612430565b60008282188284110282186109d2565b60008181526002602052604090205465ffffffffffff168015801590611e1a5750611e1881611977565b155b1561083e5760405163813e945960e01b81526004810183905260240161091a565b6000610826825490565b6000806004831015611e5c57506000905080610e8c565b306001600160a01b03861603611e7f57610e4330611e7a8686611452565b611bec565b6000806000611e8e8787611f0f565b92509250925082158015611ea65750611ea630610c8f565b15611eba5760008094509450505050610e8c565b600080611ec7848b610ed7565b9150915081611ee157600080965096505050505050610e8c565b611ef78363ffffffff168263ffffffff16611dde565b63ffffffff8116159b909a5098505050505050505050565b600080806004841015611f2a575060009150819050806120fa565b6000611f368686611452565b90506001600160e01b031981166310a6aa3760e31b1480611f6757506001600160e01b031981166330cae18760e01b145b80611f8257506001600160e01b0319811663294b14a960e11b145b80611f9d57506001600160e01b03198116635326cae760e11b145b80611fb857506001600160e01b0319811663d22b598960e01b145b15611fce576001600080935093509350506120fa565b6001600160e01b0319811663063fc60f60e21b1480611ffd57506001600160e01b0319811663167bd39560e01b145b8061201857506001600160e01b031981166308d6122d60e01b145b1561205a57600061202d60246004888a612b66565b81019061203a919061273d565b9050600061204782610ad1565b600196506000955093506120fa92505050565b6001600160e01b0319811663012e238d60e51b148061208957506001600160e01b03198116635be958b160e11b145b156120e457600061209e60246004888a612b66565b8101906120ab9190612560565b905060016120d5826001600160401b03908116600090815260016020819052604090912001541690565b600094509450945050506120fa565b60006120f03083610b11565b6000935093509350505b9250925092565b606082612116576121118261245a565b6109d2565b815115801561212d57506001600160a01b0384163b155b1561215657604051639996b31560e01b81526001600160a01b038516600482015260240161091a565b50806109d2565b6000806000612174866001600160701b031661136e565b905060006121b18563ffffffff168763ffffffff168463ffffffff161161219c5760006121a6565b6121a68885612cc2565b63ffffffff16611dde565b90508063ffffffff166121c2611d05565b6121cc9190612c13565b925063ffffffff8616602083901b67ffffffff0000000016604085901b6dffffffffffff000000000000000016171793505050935093915050565b600081815260018301602052604081205461224e57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610826565b506000610826565b69ffffffffffffffffffff602083901c166001600160701b03831665ffffffffffff604085901c811690841681111561229157828282612296565b816000805b9250925092509250925092565b6060816000018054806020026020016040519081016040528092919081815260200182805480156122f357602002820191906000526020600020905b8154815260200190600101908083116122df575b50505050509050919050565b600081815260018301602052604081205480156123e8576000612323600183612b53565b855490915060009061233790600190612b53565b905080821461239c57600086600001828154811061235757612357612a7b565b906000526020600020015490508087600001848154811061237a5761237a612a7b565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806123ad576123ad612cdf565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610826565b6000915050610826565b5092915050565b600065ffffffffffff82111561242c576040516306dfcc6560e41b8152603060048201526024810183905260440161091a565b5090565b600082600001828154811061244757612447612a7b565b9060005260206000200154905092915050565b80511561246957805160208201fd5b60405163d6bda27560e01b815260040160405180910390fd5b50565b6001600160a01b038116811461248257600080fd5b60008083601f8401126124ac57600080fd5b5081356001600160401b038111156124c357600080fd5b6020830191508360208260051b8501011115610f4d57600080fd5b80356001600160401b03811681146124f557600080fd5b919050565b6000806000806060858703121561251057600080fd5b843561251b81612485565b935060208501356001600160401b0381111561253657600080fd5b6125428782880161249a565b90945092506125559050604086016124de565b905092959194509250565b60006020828403121561257257600080fd5b6109d2826124de565b6000806040838503121561258e57600080fd5b823561259981612485565b9150602083013580151581146125ae57600080fd5b809150509250929050565b600080604083850312156125cc57600080fd5b82356125d781612485565b915060208301356125ae81612485565b60008083601f8401126125f957600080fd5b5081356001600160401b0381111561261057600080fd5b602083019150836020828501011115610f4d57600080fd5b60008060006040848603121561263d57600080fd5b833561264881612485565b925060208401356001600160401b0381111561266357600080fd5b61266f868287016125e7565b9497909650939450505050565b803563ffffffff811681146124f557600080fd5b6000806000606084860312156126a557600080fd5b6126ae846124de565b925060208401356126be81612485565b91506126cc6040850161267c565b90509250925092565b600080604083850312156126e857600080fd5b6125d7836124de565b6000806040838503121561270457600080fd5b61270d836124de565b915061271b602084016124de565b90509250929050565b60006020828403121561273657600080fd5b5035919050565b60006020828403121561274f57600080fd5b81356109d281612485565b6001600160e01b03198116811461248257600080fd5b6000806040838503121561278357600080fd5b823561278e81612485565b915060208301356125ae8161275a565b6000806000604084860312156127b357600080fd5b612648846124de565b6020808252825182820181905260009190848201906040850190845b818110156127fd5783516001600160a01b0316835292840192918401916001016127d8565b50909695505050505050565b6000806040838503121561281c57600080fd5b612825836124de565b915061271b6020840161267c565b6000806000806060858703121561284957600080fd5b843561285481612485565b9350602085013561286481612485565b925060408501356001600160401b0381111561287f57600080fd5b61288b878288016125e7565b95989497509550505050565b600080602083850312156128aa57600080fd5b82356001600160401b038111156128c057600080fd5b6128cc8582860161249a565b90969095509350505050565b60005b838110156128f35781810151838201526020016128db565b50506000910152565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561296957878503603f190184528151805180875261294a818989018a85016128d8565b601f01601f191695909501860194509285019290850190600101612923565b5092979650505050505050565b60008060006060848603121561298b57600080fd5b833561299681612485565b925060208401356129a681612485565b915060408401356129b68161275a565b809150509250925092565b600080604083850312156129d457600080fd5b823561282581612485565b600080604083850312156129f257600080fd5b6129fb836124de565b946020939093013593505050565b60008060008060608587031215612a1f57600080fd5b8435612a2a81612485565b935060208501356001600160401b03811115612a4557600080fd5b612a51878288016125e7565b909450925050604085013565ffffffffffff81168114612a7057600080fd5b939692955090935050565b634e487b7160e01b600052603260045260246000fd5b600060208284031215612aa357600080fd5b81356109d28161275a565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b602081526000612aeb602083018486612aae565b949350505050565b600060208284031215612b0557600080fd5b81516109d28161275a565b6001600160a01b038581168252841660208201526060604082018190526000906116469083018486612aae565b634e487b7160e01b600052601160045260246000fd5b8181038181111561082657610826612b3d565b60008085851115612b7657600080fd5b83861115612b8357600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000808335601e19843603018112612bbd57600080fd5b8301803591506001600160401b03821115612bd757600080fd5b602001915036819003821315610f4d57600080fd5b828482376000838201600081528351612c098183602088016128d8565b0195945050505050565b65ffffffffffff8181168382160190808211156123f2576123f2612b3d565b65ffffffffffff861681526001600160a01b03858116602083015284166040820152608060608201819052600090612c6d9083018486612aae565b979650505050505050565b6001600160e01b03198135818116916004851015610e055760049490940360031b84901b1690921692915050565b60008251612cb88184602087016128d8565b9190910192915050565b63ffffffff8281168282160390808211156123f2576123f2612b3d565b634e487b7160e01b600052603160045260246000fdfea2646970667358221220a5f431b284777d609a182b1d18254eda749a5abec857d0c186374bdf3db2f9c764736f6c63430008190033",
1234
+ "deployedBytecode": "0x6080604052600436106102045760003560e01c806375b238fc11610118578063b7d2b162116100a0578063d6bb62c61161006f578063d6bb62c6146106cc578063d78a83b1146106ec578063f801a69814610724578063fc8610d11461075e578063fe0776f51461077e57600080fd5b8063b7d2b16214610656578063cc1b6c8114610676578063d1f856ee1461068c578063d22b5989146106ac57600080fd5b8063a5808e2f116100e7578063a5808e2f14610572578063a64d95ce1461059f578063abd9bd2a146105bf578063ac9650d8146105ed578063b70096131461061a57600080fd5b806375b238fc146104ed578063853551b81461050257806394c7d7ee14610522578063a166aa891461054257600080fd5b806330cae1871161019b5780634665096d1161016a5780634665096d1461043a5780634c1da1e2146104505780635296295214610470578063530dd456146104905780636d5115bd146104cd57600080fd5b806330cae1871461038e5780633adc277a146103ae5780633ca7c02a146103e55780634136a33c1461040057600080fd5b806318ff183c116101d757806318ff183c146102e15780631cff79cd1461030157806325c471a0146103145780633078f1141461033457600080fd5b806308d6122d146102095780630b0a93ba1461022b57806312be87271461028c578063167bd395146102c1575b600080fd5b34801561021557600080fd5b506102296102243660046124fa565b61079e565b005b34801561023757600080fd5b5061026f610246366004612560565b6001600160401b0390811660009081526001602081905260409091200154600160401b90041690565b6040516001600160401b0390911681526020015b60405180910390f35b34801561029857600080fd5b506102ac6102a7366004612560565b6107f1565b60405163ffffffff9091168152602001610283565b3480156102cd57600080fd5b506102296102dc36600461257b565b61082c565b3480156102ed57600080fd5b506102296102fc3660046125b9565b610842565b6102ac61030f366004612628565b6108a9565b34801561032057600080fd5b5061022961032f366004612690565b6109d9565b34801561034057600080fd5b5061035461034f3660046126d5565b610a27565b604051610283949392919065ffffffffffff948516815263ffffffff93841660208201529190921660408201529116606082015260800190565b34801561039a57600080fd5b506102296103a93660046126f1565b610a8c565b3480156103ba57600080fd5b506103ce6103c9366004612724565b610a9e565b60405165ffffffffffff9091168152602001610283565b3480156103f157600080fd5b5061026f6001600160401b0381565b34801561040c57600080fd5b506102ac61041b366004612724565b600090815260026020526040902054600160301b900463ffffffff1690565b34801561044657600080fd5b5062093a806102ac565b34801561045c57600080fd5b506102ac61046b36600461273d565b610ad1565b34801561047c57600080fd5b5061022961048b3660046126f1565b610aff565b34801561049c57600080fd5b5061026f6104ab366004612560565b6001600160401b03908116600090815260016020819052604090912001541690565b3480156104d957600080fd5b5061026f6104e8366004612770565b610b11565b3480156104f957600080fd5b5061026f600081565b34801561050e57600080fd5b5061022961051d36600461279e565b610b4c565b34801561052e57600080fd5b5061022961053d366004612628565b610be3565b34801561054e57600080fd5b5061056261055d36600461273d565b610c8f565b6040519015158152602001610283565b34801561057e57600080fd5b5061059261058d366004612560565b610cb7565b60405161028391906127bc565b3480156105ab57600080fd5b506102296105ba366004612809565b610cdb565b3480156105cb57600080fd5b506105df6105da366004612833565b610ced565b604051908152602001610283565b3480156105f957600080fd5b5061060d610608366004612897565b610d26565b60405161028391906128fc565b34801561062657600080fd5b5061063a610635366004612976565b610e0d565b60408051921515835263ffffffff909116602083015201610283565b34801561066257600080fd5b506102296106713660046126d5565b610e94565b34801561068257600080fd5b50620697806102ac565b34801561069857600080fd5b5061063a6106a73660046126d5565b610ed7565b3480156106b857600080fd5b506102296106c73660046129c1565b610f54565b3480156106d857600080fd5b506102ac6106e7366004612833565b610f66565b3480156106f857600080fd5b5061070c6107073660046129df565b6110c0565b6040516001600160a01b039091168152602001610283565b34801561073057600080fd5b5061074461073f366004612a09565b6110e2565b6040805192835263ffffffff909116602083015201610283565b34801561076a57600080fd5b506105df610779366004612560565b611227565b34801561078a57600080fd5b506102296107993660046126d5565b611248565b6107a6611271565b60005b828110156107ea576107e2858585848181106107c7576107c7612a7b565b90506020020160208101906107dc9190612a91565b846112ec565b6001016107a9565b5050505050565b6001600160401b03811660009081526001602081905260408220015461082690600160801b90046001600160701b031661136e565b92915050565b610834611271565b61083e828261138d565b5050565b61084a611271565b604051637a9e5e4b60e01b81526001600160a01b038281166004830152831690637a9e5e4b90602401600060405180830381600087803b15801561088d57600080fd5b505af11580156108a1573d6000803e3d6000fd5b505050505050565b60003381806108ba838888886113ff565b91509150811580156108d0575063ffffffff8116155b156109235782876108e18888611452565b6040516381c6f24b60e01b81526001600160a01b0393841660048201529290911660248301526001600160e01b03191660448201526064015b60405180910390fd5b600061093184898989610ced565b9050600063ffffffff8316151580610958575061094d82610a9e565b65ffffffffffff1615155b15610969576109668261146a565b90505b60035461097f8a61097a8b8b611452565b61156a565b6003819055506109c78a8a8a8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152503492506115ac915050565b506003559450505050505b9392505050565b6109e1611271565b60006109f784846109f1876107f1565b85611650565b90508015610a21576001600160401b03841660009081526004602052604090206107ea908461189b565b50505050565b6001600160401b03821660009081526001602090815260408083206001600160a01b03851684529091528120805465ffffffffffff811692918291829190610a7e90600160301b90046001600160701b03166118b0565b969991985096509350505050565b610a94611271565b61083e82826118d3565b60008181526002602052604081205465ffffffffffff16610abe81611977565b610ac857806109d2565b60009392505050565b6001600160a01b038116600090815260208190526040812060010154610826906001600160701b031661136e565b610b07611271565b61083e82826119a6565b6001600160a01b0382166000908152602081815260408083206001600160e01b0319851684529091529020546001600160401b031692915050565b610b54611271565b6001600160401b0383161580610b7257506001600160401b03838116145b15610b9b5760405163061c6a4360e21b81526001600160401b038416600482015260240161091a565b826001600160401b03167f1256f5b5ecb89caec12db449738f2fbcd1ba5806cf38f35413f4e5c15bf6a4508383604051610bd6929190612ad7565b60405180910390a2505050565b60408051638fb3603760e01b80825291513392918391638fb36037916004808201926020929091908290030181865afa158015610c24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c489190612af3565b6001600160e01b03191614610c7b57604051630641fee960e31b81526001600160a01b038216600482015260240161091a565b6107ea610c8a85838686610ced565b61146a565b6001600160a01b0316600090815260208190526040902060010154600160701b900460ff1690565b6001600160401b038116600090815260046020526040902060609061082690611a58565b610ce3611271565b61083e8282611a65565b600084848484604051602001610d069493929190612b10565b604051602081830303815290604052805190602001209050949350505050565b604080516000815260208101909152606090826001600160401b03811115610d5057610d50612b90565b604051908082528060200260200182016040528015610d8357816020015b6060815260200190600190039081610d6e5790505b50915060005b83811015610e0557610de030868684818110610da757610da7612a7b565b9050602002810190610db99190612ba6565b85604051602001610dcc93929190612bec565b604051602081830303815290604052611b76565b838281518110610df257610df2612a7b565b6020908102919091010152600101610d89565b505092915050565b600080610e1984610c8f565b15610e2957506000905080610e8c565b306001600160a01b03861603610e4e57610e438484611bec565b600091509150610e8c565b6000610e5a8585610b11565b9050600080610e698389610ed7565b9150915081610e7a57600080610e84565b63ffffffff811615815b945094505050505b935093915050565b610e9c611271565b6000610ea88383611c03565b90508015610ed2576001600160401b0383166000908152600460205260409020610a219083611cf0565b505050565b60008067fffffffffffffffe196001600160401b03851601610eff5750600190506000610f4d565b600080610f0c8686610a27565b5050915091508165ffffffffffff16600014158015610f425750610f2e611d05565b65ffffffffffff168265ffffffffffff1611155b93509150610f4d9050565b9250929050565b610f5c611271565b61083e8282611d15565b60003381610f748585611452565b90506000610f8488888888610ced565b60008181526002602052604081205491925065ffffffffffff9091169003610fc25760405163060a299b60e41b81526004810182905260240161091a565b826001600160a01b0316886001600160a01b03161461105e576000610fe8600085610ed7565b5090506000611003610ffd6102468b87610b11565b86610ed7565b50905081158015611012575080155b1561105b57604051630ff89d4760e21b81526001600160a01b038087166004830152808c1660248301528a1660448201526001600160e01b03198516606482015260840161091a565b50505b600081815260026020526040808220805465ffffffffffff1916908190559051600160301b90910463ffffffff1691829184917fbd9ac67a6e2f6463b80927326310338bcbb4bdb7936ce1365ea3e01067e7b9f791a398975050505050505050565b6001600160401b03821660009081526004602052604081206109d29083611dd2565b60008033816110f3828989896113ff565b91505060008163ffffffff16611107611d05565b6111119190612c13565b905063ffffffff82161580611148575060008665ffffffffffff1611801561114857508065ffffffffffff168665ffffffffffff16105b156111595782896108e18a8a611452565b6111738665ffffffffffff168265ffffffffffff16611dde565b9550611181838a8a8a610ced565b945061118c85611dee565b60008581526002602052604090819020805465ffffffffffff891669ffffffffffffffffffff19821617600160301b9182900463ffffffff90811660010190811692830291909117909255915190955086907f82a2da5dee54ea8021c6545b4444620291e07ee83be6dd57edb175062715f3b490611213908a9088908f908f908f90612c32565b60405180910390a350505094509492505050565b6001600160401b038116600090815260046020526040812061082690611e3b565b6001600160a01b0381163314610e9c57604051635f159e6360e01b815260040160405180910390fd5b33600080611280838236611e45565b9150915081610ed2578063ffffffff166000036112dc5760006112a38136611f0f565b5060405163f07e038f60e01b81526001600160a01b03871660048201526001600160401b0382166024820152909250604401905061091a565b610a21610c8a8430600036610ced565b6001600160a01b0383166000818152602081815260408083206001600160e01b0319871680855290835292819020805467ffffffffffffffff19166001600160401b038716908117909155905192835292917f9ea6790c7dadfd01c9f8b9762b3682607af2c7e79e05a9f9fdf5580dde949151910160405180910390a3505050565b600080611383836001600160701b03166118b0565b5090949350505050565b6001600160a01b038216600081815260208190526040908190206001018054841515600160701b0260ff60701b19909116179055517f90d4e7bb7e5d933792b3562e1741306f8be94837e1348dacef9b6f1df56eb138906113f390841515815260200190565b60405180910390a25050565b600080306001600160a01b038616036114265761141d868585611e45565b91509150611449565b600483106114425761143d86866106358787611452565b61141d565b5060009050805b94509492505050565b60006114616004828486612b66565b6109d291612c78565b60008181526002602052604081205465ffffffffffff811690600160301b900463ffffffff168183036114b35760405163060a299b60e41b81526004810185905260240161091a565b6114bb611d05565b65ffffffffffff168265ffffffffffff1611156114ee57604051630c65b5bd60e11b81526004810185905260240161091a565b6114f782611977565b1561151857604051631e2975b960e21b81526004810185905260240161091a565b600084815260026020526040808220805465ffffffffffff191690555163ffffffff83169186917f76a2a46953689d4861a5d3f6ed883ad7e6af674a21f8e162707159fc9dde614d9190a39392505050565b604080516001600160a01b03939093166020808501919091526001600160e01b0319929092168382015280518084038201815260609093019052815191012090565b6060814710156115d85760405163cf47918160e01b81524760048201526024810183905260440161091a565b600080856001600160a01b031684866040516115f49190612ca6565b60006040518083038185875af1925050503d8060008114611631576040519150601f19603f3d011682016040523d82523d6000602084013e611636565b606091505b5091509150611646868383612101565b9695505050505050565b600067fffffffffffffffe196001600160401b0386160161168f5760405163061c6a4360e21b81526001600160401b038616600482015260240161091a565b6001600160401b03851660009081526001602090815260408083206001600160a01b038816845290915281205465ffffffffffff1615908115611781578463ffffffff166116db611d05565b6116e59190612c13565b905060405180604001604052808265ffffffffffff1681526020016117138663ffffffff1663ffffffff1690565b6001600160701b039081169091526001600160401b03891660009081526001602090815260408083206001600160a01b038c1684528252909120835181549490920151909216600160301b026001600160a01b031990931665ffffffffffff9091161791909117905561182d565b6001600160401b03871660009081526001602090815260408083206001600160a01b038a1684529091528120546117cb91600160301b9091046001600160701b031690869061215d565b6001600160401b03891660009081526001602090815260408083206001600160a01b038c168452909152902080546001600160701b03909316600160301b0273ffffffffffffffffffffffffffff000000000000199093169290921790915590505b6040805163ffffffff8616815265ffffffffffff831660208201528315158183015290516001600160a01b038816916001600160401b038a16917ff98448b987f1428e0e230e1f3c6e2ce15b5693eaf31827fbd0b1ec4b424ae7cf9181900360600190a35095945050505050565b60006109d2836001600160a01b038416612207565b60008060006118c6846118c1611d05565b612256565b9250925092509193909250565b6001600160401b03821615806118f157506001600160401b03828116145b1561191a5760405163061c6a4360e21b81526001600160401b038316600482015260240161091a565b6001600160401b038281166000818152600160208190526040808320909101805467ffffffffffffffff19169486169485179055517f1fd6dd7631312dfac2205b52913f99de03b4d7e381d5d27d3dbfe0713e6e63409190a35050565b6000611981611d05565b65ffffffffffff1661199662093a8084612c13565b65ffffffffffff16111592915050565b6001600160401b03821615806119c457506001600160401b03828116145b156119ed5760405163061c6a4360e21b81526001600160401b038316600482015260240161091a565b6001600160401b03828116600081815260016020819052604080832090910180546fffffffffffffffff00000000000000001916600160401b958716958602179055517f7a8059630b897b5de4c08ade69f8b90c3ead1f8596d62d10b6c4d14a0afb4ae29190a35050565b606060006109d2836122a3565b67fffffffffffffffe196001600160401b03831601611aa25760405163061c6a4360e21b81526001600160401b038316600482015260240161091a565b6001600160401b038216600090815260016020819052604082200154611adc90600160801b90046001600160701b0316836206978061215d565b6001600160401b0385166000818152600160208190526040918290200180546001600160701b03909516600160801b026dffffffffffffffffffffffffffff60801b199095169490941790935591519092507ffeb69018ee8b8fd50ea86348f1267d07673379f72cffdeccec63853ee8ce8b4890610bd6908590859063ffffffff92909216825265ffffffffffff16602082015260400190565b6060600080846001600160a01b031684604051611b939190612ca6565b600060405180830381855af49150503d8060008114611bce576040519150601f19603f3d011682016040523d82523d6000602084013e611bd3565b606091505b5091509150611be3858383612101565b95945050505050565b6000611bf8838361156a565b600354149392505050565b600067fffffffffffffffe196001600160401b03841601611c425760405163061c6a4360e21b81526001600160401b038416600482015260240161091a565b6001600160401b03831660009081526001602090815260408083206001600160a01b038616845290915281205465ffffffffffff169003611c8557506000610826565b6001600160401b03831660008181526001602090815260408083206001600160a01b038716808552925280832080546001600160a01b0319169055519092917ff229baa593af28c41b1d16b748cd7688f0c83aaf92d4be41c44005defe84c16691a350600192915050565b60006109d2836001600160a01b0384166122ff565b6000611d10426123f9565b905090565b6001600160a01b038216600090815260208190526040812060010154611d48906001600160701b0316836206978061215d565b6001600160a01b0385166000818152602081815260409182902060010180546dffffffffffffffffffffffffffff19166001600160701b039690961695909517909455805163ffffffff8716815265ffffffffffff841694810194909452919350917fa56b76017453f399ec2327ba00375dbfb1fd070ff854341ad6191e6a2e2de19c9101610bd6565b60006109d28383612430565b60008282188284110282186109d2565b60008181526002602052604090205465ffffffffffff168015801590611e1a5750611e1881611977565b155b1561083e5760405163813e945960e01b81526004810183905260240161091a565b6000610826825490565b6000806004831015611e5c57506000905080610e8c565b306001600160a01b03861603611e7f57610e4330611e7a8686611452565b611bec565b6000806000611e8e8787611f0f565b92509250925082158015611ea65750611ea630610c8f565b15611eba5760008094509450505050610e8c565b600080611ec7848b610ed7565b9150915081611ee157600080965096505050505050610e8c565b611ef78363ffffffff168263ffffffff16611dde565b63ffffffff8116159b909a5098505050505050505050565b600080806004841015611f2a575060009150819050806120fa565b6000611f368686611452565b90506001600160e01b031981166310a6aa3760e31b1480611f6757506001600160e01b031981166330cae18760e01b145b80611f8257506001600160e01b0319811663294b14a960e11b145b80611f9d57506001600160e01b03198116635326cae760e11b145b80611fb857506001600160e01b0319811663d22b598960e01b145b15611fce576001600080935093509350506120fa565b6001600160e01b0319811663063fc60f60e21b1480611ffd57506001600160e01b0319811663167bd39560e01b145b8061201857506001600160e01b031981166308d6122d60e01b145b1561205a57600061202d60246004888a612b66565b81019061203a919061273d565b9050600061204782610ad1565b600196506000955093506120fa92505050565b6001600160e01b0319811663012e238d60e51b148061208957506001600160e01b03198116635be958b160e11b145b156120e457600061209e60246004888a612b66565b8101906120ab9190612560565b905060016120d5826001600160401b03908116600090815260016020819052604090912001541690565b600094509450945050506120fa565b60006120f03083610b11565b6000935093509350505b9250925092565b606082612116576121118261245a565b6109d2565b815115801561212d57506001600160a01b0384163b155b1561215657604051639996b31560e01b81526001600160a01b038516600482015260240161091a565b50806109d2565b6000806000612174866001600160701b031661136e565b905060006121b18563ffffffff168763ffffffff168463ffffffff161161219c5760006121a6565b6121a68885612cc2565b63ffffffff16611dde565b90508063ffffffff166121c2611d05565b6121cc9190612c13565b925063ffffffff8616602083901b67ffffffff0000000016604085901b6dffffffffffff000000000000000016171793505050935093915050565b600081815260018301602052604081205461224e57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610826565b506000610826565b69ffffffffffffffffffff602083901c166001600160701b03831665ffffffffffff604085901c811690841681111561229157828282612296565b816000805b9250925092509250925092565b6060816000018054806020026020016040519081016040528092919081815260200182805480156122f357602002820191906000526020600020905b8154815260200190600101908083116122df575b50505050509050919050565b600081815260018301602052604081205480156123e8576000612323600183612b53565b855490915060009061233790600190612b53565b905080821461239c57600086600001828154811061235757612357612a7b565b906000526020600020015490508087600001848154811061237a5761237a612a7b565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806123ad576123ad612cdf565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610826565b6000915050610826565b5092915050565b600065ffffffffffff82111561242c576040516306dfcc6560e41b8152603060048201526024810183905260440161091a565b5090565b600082600001828154811061244757612447612a7b565b9060005260206000200154905092915050565b80511561246957805160208201fd5b60405163d6bda27560e01b815260040160405180910390fd5b50565b6001600160a01b038116811461248257600080fd5b60008083601f8401126124ac57600080fd5b5081356001600160401b038111156124c357600080fd5b6020830191508360208260051b8501011115610f4d57600080fd5b80356001600160401b03811681146124f557600080fd5b919050565b6000806000806060858703121561251057600080fd5b843561251b81612485565b935060208501356001600160401b0381111561253657600080fd5b6125428782880161249a565b90945092506125559050604086016124de565b905092959194509250565b60006020828403121561257257600080fd5b6109d2826124de565b6000806040838503121561258e57600080fd5b823561259981612485565b9150602083013580151581146125ae57600080fd5b809150509250929050565b600080604083850312156125cc57600080fd5b82356125d781612485565b915060208301356125ae81612485565b60008083601f8401126125f957600080fd5b5081356001600160401b0381111561261057600080fd5b602083019150836020828501011115610f4d57600080fd5b60008060006040848603121561263d57600080fd5b833561264881612485565b925060208401356001600160401b0381111561266357600080fd5b61266f868287016125e7565b9497909650939450505050565b803563ffffffff811681146124f557600080fd5b6000806000606084860312156126a557600080fd5b6126ae846124de565b925060208401356126be81612485565b91506126cc6040850161267c565b90509250925092565b600080604083850312156126e857600080fd5b6125d7836124de565b6000806040838503121561270457600080fd5b61270d836124de565b915061271b602084016124de565b90509250929050565b60006020828403121561273657600080fd5b5035919050565b60006020828403121561274f57600080fd5b81356109d281612485565b6001600160e01b03198116811461248257600080fd5b6000806040838503121561278357600080fd5b823561278e81612485565b915060208301356125ae8161275a565b6000806000604084860312156127b357600080fd5b612648846124de565b6020808252825182820181905260009190848201906040850190845b818110156127fd5783516001600160a01b0316835292840192918401916001016127d8565b50909695505050505050565b6000806040838503121561281c57600080fd5b612825836124de565b915061271b6020840161267c565b6000806000806060858703121561284957600080fd5b843561285481612485565b9350602085013561286481612485565b925060408501356001600160401b0381111561287f57600080fd5b61288b878288016125e7565b95989497509550505050565b600080602083850312156128aa57600080fd5b82356001600160401b038111156128c057600080fd5b6128cc8582860161249a565b90969095509350505050565b60005b838110156128f35781810151838201526020016128db565b50506000910152565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561296957878503603f190184528151805180875261294a818989018a85016128d8565b601f01601f191695909501860194509285019290850190600101612923565b5092979650505050505050565b60008060006060848603121561298b57600080fd5b833561299681612485565b925060208401356129a681612485565b915060408401356129b68161275a565b809150509250925092565b600080604083850312156129d457600080fd5b823561282581612485565b600080604083850312156129f257600080fd5b6129fb836124de565b946020939093013593505050565b60008060008060608587031215612a1f57600080fd5b8435612a2a81612485565b935060208501356001600160401b03811115612a4557600080fd5b612a51878288016125e7565b909450925050604085013565ffffffffffff81168114612a7057600080fd5b939692955090935050565b634e487b7160e01b600052603260045260246000fd5b600060208284031215612aa357600080fd5b81356109d28161275a565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b602081526000612aeb602083018486612aae565b949350505050565b600060208284031215612b0557600080fd5b81516109d28161275a565b6001600160a01b038581168252841660208201526060604082018190526000906116469083018486612aae565b634e487b7160e01b600052601160045260246000fd5b8181038181111561082657610826612b3d565b60008085851115612b7657600080fd5b83861115612b8357600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000808335601e19843603018112612bbd57600080fd5b8301803591506001600160401b03821115612bd757600080fd5b602001915036819003821315610f4d57600080fd5b828482376000838201600081528351612c098183602088016128d8565b0195945050505050565b65ffffffffffff8181168382160190808211156123f2576123f2612b3d565b65ffffffffffff861681526001600160a01b03858116602083015284166040820152608060608201819052600090612c6d9083018486612aae565b979650505050505050565b6001600160e01b03198135818116916004851015610e055760049490940360031b84901b1690921692915050565b60008251612cb88184602087016128d8565b9190910192915050565b63ffffffff8281168282160390808211156123f2576123f2612b3d565b634e487b7160e01b600052603160045260246000fdfea2646970667358221220a5f431b284777d609a182b1d18254eda749a5abec857d0c186374bdf3db2f9c764736f6c63430008190033",
1235
1235
  "linkReferences": {},
1236
1236
  "deployedLinkReferences": {}
1237
1237
  }
@@ -0,0 +1,107 @@
1
+ {
2
+ "_format": "hh-sol-artifact-1",
3
+ "contractName": "Create2Factory",
4
+ "sourceName": "contracts/factory/Create2Factory.sol",
5
+ "abi": [
6
+ {
7
+ "anonymous": false,
8
+ "inputs": [
9
+ {
10
+ "indexed": true,
11
+ "internalType": "address",
12
+ "name": "addr",
13
+ "type": "address"
14
+ },
15
+ {
16
+ "indexed": true,
17
+ "internalType": "bytes32",
18
+ "name": "salt",
19
+ "type": "bytes32"
20
+ }
21
+ ],
22
+ "name": "Deployed",
23
+ "type": "event"
24
+ },
25
+ {
26
+ "inputs": [
27
+ {
28
+ "internalType": "bytes32",
29
+ "name": "salt",
30
+ "type": "bytes32"
31
+ },
32
+ {
33
+ "internalType": "bytes",
34
+ "name": "creationCode",
35
+ "type": "bytes"
36
+ },
37
+ {
38
+ "internalType": "uint256",
39
+ "name": "value",
40
+ "type": "uint256"
41
+ }
42
+ ],
43
+ "name": "deploy",
44
+ "outputs": [
45
+ {
46
+ "internalType": "address",
47
+ "name": "addr",
48
+ "type": "address"
49
+ }
50
+ ],
51
+ "stateMutability": "nonpayable",
52
+ "type": "function"
53
+ },
54
+ {
55
+ "inputs": [
56
+ {
57
+ "internalType": "bytes32",
58
+ "name": "salt",
59
+ "type": "bytes32"
60
+ },
61
+ {
62
+ "internalType": "bytes32",
63
+ "name": "codeHash",
64
+ "type": "bytes32"
65
+ }
66
+ ],
67
+ "name": "getAddress",
68
+ "outputs": [
69
+ {
70
+ "internalType": "address",
71
+ "name": "",
72
+ "type": "address"
73
+ }
74
+ ],
75
+ "stateMutability": "view",
76
+ "type": "function"
77
+ },
78
+ {
79
+ "inputs": [
80
+ {
81
+ "internalType": "bytes32",
82
+ "name": "salt",
83
+ "type": "bytes32"
84
+ },
85
+ {
86
+ "internalType": "bytes32",
87
+ "name": "codeHash",
88
+ "type": "bytes32"
89
+ }
90
+ ],
91
+ "name": "getAddressTron",
92
+ "outputs": [
93
+ {
94
+ "internalType": "address",
95
+ "name": "",
96
+ "type": "address"
97
+ }
98
+ ],
99
+ "stateMutability": "view",
100
+ "type": "function"
101
+ }
102
+ ],
103
+ "bytecode": "0x6080604052348015600f57600080fd5b506102f98061001f6000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063933559b014610046578063c7aeef0f14610075578063d3a3968614610088575b600080fd5b61005961005436600461018e565b61009b565b6040516001600160a01b03909116815260200160405180910390f35b6100596100833660046101c6565b6100d8565b61005961009636600461018e565b61016c565b6040516000906100b990604160f81b9030908690869060200161028a565b60408051601f1981840301815291905280516020909101209392505050565b60008383516020850184f590506001600160a01b03811661012f5760405162461bcd60e51b815260206004820152600d60248201526c1111541313d657d19052531151609a1b604482015260640160405180910390fd5b60405184906001600160a01b038316907f94bfd9af14ef450884c8a7ddb5734e2e1e14e70a1c84f0801cc5a29e34d2642890600090a39392505050565b6040516000906100b9906001600160f81b03199030908690869060200161028a565b600080604083850312156101a157600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b6000806000606084860312156101db57600080fd5b83359250602084013567ffffffffffffffff808211156101fa57600080fd5b818601915086601f83011261020e57600080fd5b813581811115610220576102206101b0565b604051601f8201601f19908116603f01168101908382118183101715610248576102486101b0565b8160405282815289602084870101111561026157600080fd5b826020860160208301376000602084830101528096505050505050604084013590509250925092565b6001600160f81b031994909416845260609290921b6bffffffffffffffffffffffff19166001840152601583015260358201526055019056fea26469706673582212205fb7d781d8404b93aed56d95e5543997fe78a250c5faf35b40c771504b4c853b64736f6c63430008190033",
104
+ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c8063933559b014610046578063c7aeef0f14610075578063d3a3968614610088575b600080fd5b61005961005436600461018e565b61009b565b6040516001600160a01b03909116815260200160405180910390f35b6100596100833660046101c6565b6100d8565b61005961009636600461018e565b61016c565b6040516000906100b990604160f81b9030908690869060200161028a565b60408051601f1981840301815291905280516020909101209392505050565b60008383516020850184f590506001600160a01b03811661012f5760405162461bcd60e51b815260206004820152600d60248201526c1111541313d657d19052531151609a1b604482015260640160405180910390fd5b60405184906001600160a01b038316907f94bfd9af14ef450884c8a7ddb5734e2e1e14e70a1c84f0801cc5a29e34d2642890600090a39392505050565b6040516000906100b9906001600160f81b03199030908690869060200161028a565b600080604083850312156101a157600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b6000806000606084860312156101db57600080fd5b83359250602084013567ffffffffffffffff808211156101fa57600080fd5b818601915086601f83011261020e57600080fd5b813581811115610220576102206101b0565b604051601f8201601f19908116603f01168101908382118183101715610248576102486101b0565b8160405282815289602084870101111561026157600080fd5b826020860160208301376000602084830101528096505050505050604084013590509250925092565b6001600160f81b031994909416845260609290921b6bffffffffffffffffffffffff19166001840152601583015260358201526055019056fea26469706673582212205fb7d781d8404b93aed56d95e5543997fe78a250c5faf35b40c771504b4c853b64736f6c63430008190033",
105
+ "linkReferences": {},
106
+ "deployedLinkReferences": {}
107
+ }
@@ -0,0 +1,57 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.0;
3
+
4
+ /**
5
+ * @title Create2Factory
6
+ * @notice Universal CREATE2 factory — works on both EVM and Tron.
7
+ * @dev Address prediction differs between EVM (0xff prefix) and Tron (0x41 prefix).
8
+ * Use getAddress() on EVM chains, getAddressTron() on Tron.
9
+ *
10
+ * Usage:
11
+ * // Deploy
12
+ * bytes32 salt = keccak256("my_salt");
13
+ * bytes memory code = abi.encodePacked(type(MyContract).creationCode, abi.encode(arg1));
14
+ * address addr = factory.deploy(salt, code, 0);
15
+ *
16
+ * // Predict address (off-chain or on-chain)
17
+ * bytes32 codeHash = keccak256(code);
18
+ * address predicted = factory.getAddress(salt, codeHash); // EVM
19
+ * address predicted = factory.getAddressTron(salt, codeHash); // Tron
20
+ */
21
+ contract Create2Factory {
22
+ event Deployed(address indexed addr, bytes32 indexed salt);
23
+
24
+ /// @notice Deploy contract via CREATE2
25
+ /// @param salt Deterministic salt
26
+ /// @param creationCode Contract bytecode + constructor args
27
+ /// @param value Native token value to send to the new contract
28
+ /// @return addr The deployed contract address
29
+ function deploy(bytes32 salt, bytes memory creationCode, uint256 value)
30
+ external returns (address addr)
31
+ {
32
+ assembly {
33
+ addr := create2(value, add(creationCode, 0x20), mload(creationCode), salt)
34
+ }
35
+ require(addr != address(0), "DEPLOY_FAILED");
36
+ emit Deployed(addr, salt);
37
+ }
38
+
39
+ /// @notice Predict CREATE2 address on EVM chains
40
+ /// @param salt The same salt used in deploy()
41
+ /// @param codeHash keccak256(creationCode) — includes constructor args
42
+ function getAddress(bytes32 salt, bytes32 codeHash) external view returns (address) {
43
+ return address(uint160(uint256(keccak256(
44
+ abi.encodePacked(bytes1(0xff), address(this), salt, codeHash)
45
+ ))));
46
+ }
47
+
48
+ /// @notice Predict CREATE2 address on Tron
49
+ /// @dev Tron uses 0x41 prefix instead of 0xff, and 21-byte sender (41 + 20-byte address)
50
+ /// @param salt The same salt used in deploy()
51
+ /// @param codeHash keccak256(creationCode) — includes constructor args
52
+ function getAddressTron(bytes32 salt, bytes32 codeHash) external view returns (address) {
53
+ return address(uint160(uint256(keccak256(
54
+ abi.encodePacked(bytes1(0x41), address(this), salt, codeHash)
55
+ ))));
56
+ }
57
+ }