aiia-vault-sdk 1.4.0 → 1.4.2
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.
- package/dist/Erc20Staking.d.ts +1 -1
- package/dist/Erc20Staking.js +1 -1
- package/dist/EthStaking.d.ts +1 -1
- package/dist/EthStaking.js +1 -1
- package/dist/TradingVault.d.ts +65 -0
- package/dist/TradingVault.js +1 -1
- package/dist/abis/TradingVault.json +115 -2
- package/dist/contracts/TradingVault.d.ts +76 -2
- package/dist/contracts.json +9 -4
- package/package.json +1 -1
package/dist/Erc20Staking.d.ts
CHANGED
@@ -362,6 +362,6 @@ export declare class Erc20StakingSDK {
|
|
362
362
|
}>;
|
363
363
|
getContractAddress(): string;
|
364
364
|
getAllEvents(fromBlock: number, toBlock: number, whitelistEvents?: Array<keyof RawErc20StakingEventTypes>): Promise<ParsedErc20StakingEventRaw[]>;
|
365
|
-
streamEvents(fromBlock: number, onEvent: (event: ParsedErc20StakingEvent) => Promise<void>, saveLatestBlock: (blockNumber: number) => Promise<void>, batchSize?: number, sleepTime?: number, blockGap?: number): Promise<void>;
|
365
|
+
streamEvents(fromBlock: number, onEvent: (event: ParsedErc20StakingEvent) => Promise<void>, saveLatestBlock: (blockNumber: number) => Promise<void>, batchSize?: number, sleepTime?: number, blockGap?: number, shouldContinue?: () => Promise<boolean> | boolean): Promise<void>;
|
366
366
|
formatEventArgs: (event: ParsedErc20StakingEventRaw) => ParsedErc20StakingEvent;
|
367
367
|
}
|
package/dist/Erc20Staking.js
CHANGED
@@ -1 +1 @@
|
|
1
|
-
"use strict";var t=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.Erc20StakingSDK=void 0;const e=require("ethers"),a=t(require("./abis/Erc20Staking.json")),s=t(require("./contracts.json")),n=require("./utils");exports.Erc20StakingSDK=class{constructor(t,r,o){this.name="Erc20Staking",this.tokenAddress=e.ethers.ZeroAddress,this.tokenDecimals=18,this.isBootstrapped=!1,this.formatEventArgs=t=>{const{eventName:e,args:a}=t;switch(e){case"Staked":case"Unstaked":return{...t,args:{...a,user:a.user.toLowerCase(),amount:this.parseTokenAmount(a.amount),timestamp:Number(a.timestamp)}};case"RewardHarvested":return{...t,args:{...a,user:a.user.toLowerCase(),amount:this.parseTokenAmount(a.amount),timestamp:Number(a.timestamp),signatureHash:a.signatureHash}};case"SignerUpdated":return{...t,args:{...a,newSigner:a.newSigner.toLowerCase()}};case"MinStakeUpdated":return{...t,args:{...a,oldAmount:this.parseTokenAmount(a.oldAmount),newAmount:this.parseTokenAmount(a.newAmount)}};case"TokenUpdated":return{...t,args:{...a,newToken:a.newToken.toLowerCase()}};default:return t}};const i=Array.isArray(t)?t:[t];this.providers=i.map((t=>new e.ethers.JsonRpcProvider(t,void 0,{staticNetwork:!0})));const d=(0,n.getRandomProvider)(this.providers);this.contractAddress=(0,n.resolveContractAddress)(i[0],this.name,s.default,r),this.contract=new e.ethers.Contract(this.contractAddress,a.default.abi,d),o?this.tokenAddress=o:this.loadTokenAddress()}async loadTokenAddress(){try{this.tokenAddress=await this.contract.stakingToken(),this.tokenContract=new e.ethers.Contract(this.tokenAddress,["function decimals() view returns (uint8)","function symbol() view returns (string)","function balanceOf(address owner) view returns (uint256)","function allowance(address owner, address spender) view returns (uint256)","function approve(address spender, uint256 amount) returns (bool)"],this.getRandomProvider());try{this.tokenDecimals=await this.tokenContract.decimals()}catch(t){console.warn("Could not load token decimals, defaulting to 18")}}catch(t){console.error("Could not load token address from contract")}}getRandomProvider(){return(0,n.getRandomProvider)(this.providers)}getContractWithRandomProvider(){return new e.ethers.Contract(this.contractAddress,a.default.abi,this.getRandomProvider())}async bootstrap(){if(this.isBootstrapped)return;const t=await Promise.all(this.providers.map(((t,e)=>(0,n.checkRpcHealth)(t,e))));if(this.providers=this.providers.filter(((e,a)=>t[a])),0===this.providers.length)throw new Error("No active RPC providers available");this.tokenAddress===e.ethers.ZeroAddress&&await this.loadTokenAddress(),this.isBootstrapped=!0}async signAndSendTransaction(t,e,a={}){return(0,n.signAndSendTransaction)(t,e,(()=>this.getRandomProvider()),a,this.contract)}getTokenDecimals(){return this.tokenAddress&&this.tokenAddress!==e.ethers.ZeroAddress||this.loadTokenAddress(),this.tokenDecimals}async getTokenAddress(){return this.tokenAddress&&this.tokenAddress!==e.ethers.ZeroAddress||await this.loadTokenAddress(),this.tokenAddress}async formatTokenAmount(t){const a=await this.getTokenDecimals();return e.ethers.parseUnits(t.toString(),a)}parseTokenAmount(t){const a=this.getTokenDecimals();return Number(e.ethers.formatUnits(t,a))}async getTokenBalanceRaw(t){return this.tokenAddress&&this.tokenAddress!==e.ethers.ZeroAddress||await this.loadTokenAddress(),await this.tokenContract.balanceOf(t)}async getTokenBalance(t){const e=await this.getTokenBalanceRaw(t);return this.parseTokenAmount(e)}async getTokenAllowanceRaw(t){return this.tokenAddress&&this.tokenAddress!==e.ethers.ZeroAddress||await this.loadTokenAddress(),await this.tokenContract.allowance(t,this.contractAddress)}async getTokenAllowance(t){const e=await this.getTokenAllowanceRaw(t);return this.parseTokenAmount(e)}async buildApproveTokenTx(t){const e=await this.formatTokenAmount(t);return(0,n.buildApproveERC20Tx)(this.tokenAddress,this.contractAddress,e,this.getRandomProvider())}async buildApproveUnlimitedTokenTx(){return await this.buildApproveTokenTx(1e6)}async buildStakeTxRaw(t){return await this.contract.stake.populateTransaction(t)}async buildStakeTx(t){const e=await this.formatTokenAmount(t);return await this.buildStakeTxRaw(e)}async buildUnstakeTxRaw(t){return await this.contract.unstake.populateTransaction(t)}async buildUnstakeTx(t){const e=await this.formatTokenAmount(t);return await this.buildUnstakeTxRaw(e)}async buildHarvestRewardTxRaw(t,e,a,s){return await this.contract.harvestReward.populateTransaction(t,e,a,s)}async buildHarvestRewardTx(t,e,a,s){const n=await this.formatTokenAmount(t);return await this.buildHarvestRewardTxRaw(n,BigInt(e),BigInt(a),s)}async buildUnstakeAndHarvestTxRaw(t,e,a,s,n){return await this.contract.unstakeAndHarvest.populateTransaction(t,e,a,s,n)}async buildUnstakeAndHarvestTx(t,e,a,s,n){const r=await this.formatTokenAmount(t),o=await this.formatTokenAmount(e);return await this.buildUnstakeAndHarvestTxRaw(r,o,BigInt(a),BigInt(s),n)}async buildAddRewardsTxRaw(t){return await this.contract.addRewards.populateTransaction(t)}async buildAddRewardsTx(t){const e=await this.formatTokenAmount(t);return await this.buildAddRewardsTxRaw(e)}async buildUpdateMaxRewardAmountTxRaw(t){return await this.contract.updateMaxRewardAmount.populateTransaction(t)}async buildUpdateMaxRewardAmountTx(t){const e=await this.formatTokenAmount(t);return await this.buildUpdateMaxRewardAmountTxRaw(e)}async buildSetMinStakeAmountTxRaw(t){return await this.contract.setMinStakeAmount.populateTransaction(t)}async buildSetMinStakeAmountTx(t){const e=await this.formatTokenAmount(t);return await this.buildSetMinStakeAmountTxRaw(e)}async buildUpdateStakingTokenTx(t){return await this.contract.updateStakingToken.populateTransaction(t)}async buildAddSignerTx(t){return await this.contract.addSigner.populateTransaction(t)}async buildRemoveSignerTx(t){return await this.contract.removeSigner.populateTransaction(t)}async buildPauseTx(){return await this.contract.pause.populateTransaction()}async buildUnpauseTx(){return await this.contract.unpause.populateTransaction()}async buildEmergencyWithdrawTx(t){return await this.contract.emergencyWithdraw.populateTransaction(t)}async getTotalStakedRaw(){return await this.contract.totalStaked()}async getTotalStaked(){const t=await this.getTotalStakedRaw();return this.parseTokenAmount(t)}async getTotalRewardsRaw(){return await this.contract.totalRewards()}async getTotalRewards(){const t=await this.getTotalRewardsRaw();return this.parseTokenAmount(t)}async getMaxRewardAmountRaw(){return await this.contract.maxRewardAmount()}async getMaxRewardAmount(){const t=await this.getMaxRewardAmountRaw();return this.parseTokenAmount(t)}async getMinStakeAmountRaw(){return await this.contract.minStakeAmount()}async getMinStakeAmount(){const t=await this.getMinStakeAmountRaw();return this.parseTokenAmount(t)}async getUserInfoRaw(t){const[e,a]=await this.contract.getUserInfo(t);return{stake:e,harvested:a}}async getUserInfo(t){const{stake:e,harvested:a}=await this.getUserInfoRaw(t);return{stake:await this.parseTokenAmount(e),harvested:await this.parseTokenAmount(a)}}async getUserStakeRaw(t){return await this.contract.userStakes(t)}async getUserStake(t){const e=await this.getUserStakeRaw(t);return this.parseTokenAmount(e)}async getUserTotalRewardsHarvestedRaw(t){return await this.contract.userTotalRewardsHarvested(t)}async getUserTotalRewardsHarvested(t){const e=await this.getUserTotalRewardsHarvestedRaw(t);return this.parseTokenAmount(e)}async isPaused(){return await this.contract.paused()}async getOperatorRoleHash(){return await this.contract.OPERATOR_ROLE()}async getSignerRoleHash(){return await this.contract.SIGNER_ROLE()}async getAdminRoleHash(){return await this.contract.DEFAULT_ADMIN_ROLE()}async hasOperatorRole(t){const e=await this.contract.OPERATOR_ROLE();return await this.contract.hasRole(e,t)}async hasSignerRole(t){const e=await this.contract.SIGNER_ROLE();return await this.contract.hasRole(e,t)}async hasAdminRole(t){const e=await this.contract.DEFAULT_ADMIN_ROLE();return await this.contract.hasRole(e,t)}async createRewardSignature(t,a,s,n,r,o){const i=await this.formatTokenAmount(s),d=e.ethers.solidityPackedKeccak256(["address","address","uint256","uint256","uint256"],[t,a,i,n,r]),c=new e.ethers.Wallet(o);return{signature:await c.signMessage(e.ethers.getBytes(d)),messageHash:d.toString()}}getContractAddress(){return this.contractAddress}async getAllEvents(t,e,a){return await this.bootstrap(),(0,n.getAllEvents)(this.contract,(()=>this.getRandomProvider()),(()=>this.getContractWithRandomProvider()),t,e,a)}async streamEvents(t,e,a,s=1e3,r=5e3,o=0){const
|
1
|
+
"use strict";var t=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.Erc20StakingSDK=void 0;const e=require("ethers"),a=t(require("./abis/Erc20Staking.json")),s=t(require("./contracts.json")),n=require("./utils");exports.Erc20StakingSDK=class{constructor(t,r,o){this.name="Erc20Staking",this.tokenAddress=e.ethers.ZeroAddress,this.tokenDecimals=18,this.isBootstrapped=!1,this.formatEventArgs=t=>{const{eventName:e,args:a}=t;switch(e){case"Staked":case"Unstaked":return{...t,args:{...a,user:a.user.toLowerCase(),amount:this.parseTokenAmount(a.amount),timestamp:Number(a.timestamp)}};case"RewardHarvested":return{...t,args:{...a,user:a.user.toLowerCase(),amount:this.parseTokenAmount(a.amount),timestamp:Number(a.timestamp),signatureHash:a.signatureHash}};case"SignerUpdated":return{...t,args:{...a,newSigner:a.newSigner.toLowerCase()}};case"MinStakeUpdated":return{...t,args:{...a,oldAmount:this.parseTokenAmount(a.oldAmount),newAmount:this.parseTokenAmount(a.newAmount)}};case"TokenUpdated":return{...t,args:{...a,newToken:a.newToken.toLowerCase()}};default:return t}};const i=Array.isArray(t)?t:[t];this.providers=i.map((t=>new e.ethers.JsonRpcProvider(t,void 0,{staticNetwork:!0})));const d=(0,n.getRandomProvider)(this.providers);this.contractAddress=(0,n.resolveContractAddress)(i[0],this.name,s.default,r),this.contract=new e.ethers.Contract(this.contractAddress,a.default.abi,d),o?this.tokenAddress=o:this.loadTokenAddress()}async loadTokenAddress(){try{this.tokenAddress=await this.contract.stakingToken(),this.tokenContract=new e.ethers.Contract(this.tokenAddress,["function decimals() view returns (uint8)","function symbol() view returns (string)","function balanceOf(address owner) view returns (uint256)","function allowance(address owner, address spender) view returns (uint256)","function approve(address spender, uint256 amount) returns (bool)"],this.getRandomProvider());try{this.tokenDecimals=await this.tokenContract.decimals()}catch(t){console.warn("Could not load token decimals, defaulting to 18")}}catch(t){console.error("Could not load token address from contract")}}getRandomProvider(){return(0,n.getRandomProvider)(this.providers)}getContractWithRandomProvider(){return new e.ethers.Contract(this.contractAddress,a.default.abi,this.getRandomProvider())}async bootstrap(){if(this.isBootstrapped)return;const t=await Promise.all(this.providers.map(((t,e)=>(0,n.checkRpcHealth)(t,e))));if(this.providers=this.providers.filter(((e,a)=>t[a])),0===this.providers.length)throw new Error("No active RPC providers available");this.tokenAddress===e.ethers.ZeroAddress&&await this.loadTokenAddress(),this.isBootstrapped=!0}async signAndSendTransaction(t,e,a={}){return(0,n.signAndSendTransaction)(t,e,(()=>this.getRandomProvider()),a,this.contract)}getTokenDecimals(){return this.tokenAddress&&this.tokenAddress!==e.ethers.ZeroAddress||this.loadTokenAddress(),this.tokenDecimals}async getTokenAddress(){return this.tokenAddress&&this.tokenAddress!==e.ethers.ZeroAddress||await this.loadTokenAddress(),this.tokenAddress}async formatTokenAmount(t){const a=await this.getTokenDecimals();return e.ethers.parseUnits(t.toString(),a)}parseTokenAmount(t){const a=this.getTokenDecimals();return Number(e.ethers.formatUnits(t,a))}async getTokenBalanceRaw(t){return this.tokenAddress&&this.tokenAddress!==e.ethers.ZeroAddress||await this.loadTokenAddress(),await this.tokenContract.balanceOf(t)}async getTokenBalance(t){const e=await this.getTokenBalanceRaw(t);return this.parseTokenAmount(e)}async getTokenAllowanceRaw(t){return this.tokenAddress&&this.tokenAddress!==e.ethers.ZeroAddress||await this.loadTokenAddress(),await this.tokenContract.allowance(t,this.contractAddress)}async getTokenAllowance(t){const e=await this.getTokenAllowanceRaw(t);return this.parseTokenAmount(e)}async buildApproveTokenTx(t){const e=await this.formatTokenAmount(t);return(0,n.buildApproveERC20Tx)(this.tokenAddress,this.contractAddress,e,this.getRandomProvider())}async buildApproveUnlimitedTokenTx(){return await this.buildApproveTokenTx(1e6)}async buildStakeTxRaw(t){return await this.contract.stake.populateTransaction(t)}async buildStakeTx(t){const e=await this.formatTokenAmount(t);return await this.buildStakeTxRaw(e)}async buildUnstakeTxRaw(t){return await this.contract.unstake.populateTransaction(t)}async buildUnstakeTx(t){const e=await this.formatTokenAmount(t);return await this.buildUnstakeTxRaw(e)}async buildHarvestRewardTxRaw(t,e,a,s){return await this.contract.harvestReward.populateTransaction(t,e,a,s)}async buildHarvestRewardTx(t,e,a,s){const n=await this.formatTokenAmount(t);return await this.buildHarvestRewardTxRaw(n,BigInt(e),BigInt(a),s)}async buildUnstakeAndHarvestTxRaw(t,e,a,s,n){return await this.contract.unstakeAndHarvest.populateTransaction(t,e,a,s,n)}async buildUnstakeAndHarvestTx(t,e,a,s,n){const r=await this.formatTokenAmount(t),o=await this.formatTokenAmount(e);return await this.buildUnstakeAndHarvestTxRaw(r,o,BigInt(a),BigInt(s),n)}async buildAddRewardsTxRaw(t){return await this.contract.addRewards.populateTransaction(t)}async buildAddRewardsTx(t){const e=await this.formatTokenAmount(t);return await this.buildAddRewardsTxRaw(e)}async buildUpdateMaxRewardAmountTxRaw(t){return await this.contract.updateMaxRewardAmount.populateTransaction(t)}async buildUpdateMaxRewardAmountTx(t){const e=await this.formatTokenAmount(t);return await this.buildUpdateMaxRewardAmountTxRaw(e)}async buildSetMinStakeAmountTxRaw(t){return await this.contract.setMinStakeAmount.populateTransaction(t)}async buildSetMinStakeAmountTx(t){const e=await this.formatTokenAmount(t);return await this.buildSetMinStakeAmountTxRaw(e)}async buildUpdateStakingTokenTx(t){return await this.contract.updateStakingToken.populateTransaction(t)}async buildAddSignerTx(t){return await this.contract.addSigner.populateTransaction(t)}async buildRemoveSignerTx(t){return await this.contract.removeSigner.populateTransaction(t)}async buildPauseTx(){return await this.contract.pause.populateTransaction()}async buildUnpauseTx(){return await this.contract.unpause.populateTransaction()}async buildEmergencyWithdrawTx(t){return await this.contract.emergencyWithdraw.populateTransaction(t)}async getTotalStakedRaw(){return await this.contract.totalStaked()}async getTotalStaked(){const t=await this.getTotalStakedRaw();return this.parseTokenAmount(t)}async getTotalRewardsRaw(){return await this.contract.totalRewards()}async getTotalRewards(){const t=await this.getTotalRewardsRaw();return this.parseTokenAmount(t)}async getMaxRewardAmountRaw(){return await this.contract.maxRewardAmount()}async getMaxRewardAmount(){const t=await this.getMaxRewardAmountRaw();return this.parseTokenAmount(t)}async getMinStakeAmountRaw(){return await this.contract.minStakeAmount()}async getMinStakeAmount(){const t=await this.getMinStakeAmountRaw();return this.parseTokenAmount(t)}async getUserInfoRaw(t){const[e,a]=await this.contract.getUserInfo(t);return{stake:e,harvested:a}}async getUserInfo(t){const{stake:e,harvested:a}=await this.getUserInfoRaw(t);return{stake:await this.parseTokenAmount(e),harvested:await this.parseTokenAmount(a)}}async getUserStakeRaw(t){return await this.contract.userStakes(t)}async getUserStake(t){const e=await this.getUserStakeRaw(t);return this.parseTokenAmount(e)}async getUserTotalRewardsHarvestedRaw(t){return await this.contract.userTotalRewardsHarvested(t)}async getUserTotalRewardsHarvested(t){const e=await this.getUserTotalRewardsHarvestedRaw(t);return this.parseTokenAmount(e)}async isPaused(){return await this.contract.paused()}async getOperatorRoleHash(){return await this.contract.OPERATOR_ROLE()}async getSignerRoleHash(){return await this.contract.SIGNER_ROLE()}async getAdminRoleHash(){return await this.contract.DEFAULT_ADMIN_ROLE()}async hasOperatorRole(t){const e=await this.contract.OPERATOR_ROLE();return await this.contract.hasRole(e,t)}async hasSignerRole(t){const e=await this.contract.SIGNER_ROLE();return await this.contract.hasRole(e,t)}async hasAdminRole(t){const e=await this.contract.DEFAULT_ADMIN_ROLE();return await this.contract.hasRole(e,t)}async createRewardSignature(t,a,s,n,r,o){const i=await this.formatTokenAmount(s),d=e.ethers.solidityPackedKeccak256(["address","address","uint256","uint256","uint256"],[t,a,i,n,r]),c=new e.ethers.Wallet(o);return{signature:await c.signMessage(e.ethers.getBytes(d)),messageHash:d.toString()}}getContractAddress(){return this.contractAddress}async getAllEvents(t,e,a){return await this.bootstrap(),(0,n.getAllEvents)(this.contract,(()=>this.getRandomProvider()),(()=>this.getContractWithRandomProvider()),t,e,a)}async streamEvents(t,e,a,s=1e3,r=5e3,o=0,i){const d=["Staked","Unstaked","RewardHarvested"];return await this.bootstrap(),(0,n.streamEvents)({getProvider:()=>this.getRandomProvider(),getAllEvents:(t,e)=>this.getAllEvents(t,e,d),formatEvent:t=>this.formatEventArgs(t),onEvent:e,saveLatestBlock:a,fromBlock:t,batchSize:s,sleepTime:r,blockGap:o,shouldContinue:i})}};
|
package/dist/EthStaking.d.ts
CHANGED
@@ -295,6 +295,6 @@ export declare class EthStakingSDK {
|
|
295
295
|
}>;
|
296
296
|
getContractAddress(): string;
|
297
297
|
getAllEvents(fromBlock: number, toBlock: number, whitelistEvents?: Array<keyof RawEthStakingEventTypes>): Promise<ParsedEthStakingEventRaw[]>;
|
298
|
-
streamEvents(fromBlock: number, onEvent: (event: ParsedEthStakingEvent) => Promise<void>, saveLatestBlock: (blockNumber: number) => Promise<void>, batchSize?: number, sleepTime?: number, blockGap?: number): Promise<void>;
|
298
|
+
streamEvents(fromBlock: number, onEvent: (event: ParsedEthStakingEvent) => Promise<void>, saveLatestBlock: (blockNumber: number) => Promise<void>, batchSize?: number, sleepTime?: number, blockGap?: number, shouldContinue?: () => Promise<boolean> | boolean): Promise<void>;
|
299
299
|
formatEventArgs: (event: ParsedEthStakingEventRaw) => ParsedEthStakingEvent;
|
300
300
|
}
|
package/dist/EthStaking.js
CHANGED
@@ -1 +1 @@
|
|
1
|
-
"use strict";var t=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.EthStakingSDK=void 0;const e=require("ethers"),a=t(require("./abis/EthStaking.json")),r=t(require("./contracts.json")),s=require("./utils");exports.EthStakingSDK=class{constructor(t,n){this.name="EthStaking",this.isBootstrapped=!1,this.formatEventArgs=t=>{const{eventName:a,args:r}=t;switch(a){case"Staked":case"Unstaked":return{...t,args:{...r,user:r.user.toLowerCase(),amount:Number(e.ethers.formatEther(r.amount)),timestamp:Number(r.timestamp)}};case"RewardHarvested":return{...t,args:{...r,user:r.user.toLowerCase(),amount:Number(e.ethers.formatEther(r.amount)),timestamp:Number(r.timestamp),signatureHash:r.signatureHash}};case"SignerUpdated":return{...t,args:{...r,newSigner:r.newSigner.toLowerCase()}};case"MinStakeUpdated":return{...t,args:{...r,oldAmount:Number(e.ethers.formatEther(r.oldAmount)),newAmount:Number(e.ethers.formatEther(r.newAmount))}};default:return t}};const i=Array.isArray(t)?t:[t];this.providers=i.map((t=>new e.ethers.JsonRpcProvider(t,void 0,{staticNetwork:!0})));const o=(0,s.getRandomProvider)(this.providers);this.contractAddress=(0,s.resolveContractAddress)(i[0],this.name,r.default,n),this.contract=new e.ethers.Contract(this.contractAddress,a.default.abi,o)}getRandomProvider(){return(0,s.getRandomProvider)(this.providers)}getContractWithRandomProvider(){return new e.ethers.Contract(this.contractAddress,a.default.abi,this.getRandomProvider())}async bootstrap(){if(this.isBootstrapped)return;const t=await Promise.all(this.providers.map(((t,e)=>(0,s.checkRpcHealth)(t,e))));if(this.providers=this.providers.filter(((e,a)=>t[a])),0===this.providers.length)throw new Error("No active RPC providers available");this.isBootstrapped=!0}async signAndSendTransaction(t,e,a={}){return(0,s.signAndSendTransaction)(t,e,(()=>this.getRandomProvider()),a,this.contract)}async buildStakeTxRaw(t){return await this.contract.stake.populateTransaction({value:t})}async buildStakeTx(t){return await this.buildStakeTxRaw(e.ethers.parseEther(t.toString()))}async buildUnstakeTxRaw(t){return await this.contract.unstake.populateTransaction(t)}async buildUnstakeTx(t){return await this.buildUnstakeTxRaw(e.ethers.parseEther(t.toString()))}async buildHarvestRewardTxRaw(t,e,a,r){return await this.contract.harvestReward.populateTransaction(t,e,a,r)}async buildHarvestRewardTx(t,a,r,s){return await this.buildHarvestRewardTxRaw(e.ethers.parseEther(t.toString()),BigInt(a),BigInt(r),s)}async buildUnstakeAndHarvestTxRaw(t,e,a,r,s){return await this.contract.unstakeAndHarvest.populateTransaction(t,e,a,r,s)}async buildUnstakeAndHarvestTx(t,a,r,s,n){return await this.buildUnstakeAndHarvestTxRaw(e.ethers.parseEther(t.toString()),e.ethers.parseEther(a.toString()),BigInt(r),BigInt(s),n)}async buildAddRewardsTxRaw(t){return await this.contract.addRewards.populateTransaction({value:t})}async buildAddRewardsTx(t){return await this.buildAddRewardsTxRaw(e.ethers.parseEther(t.toString()))}async buildUpdateMaxRewardAmountTxRaw(t){return await this.contract.updateMaxRewardAmount.populateTransaction(t)}async buildUpdateMaxRewardAmountTx(t){return await this.buildUpdateMaxRewardAmountTxRaw(e.ethers.parseEther(t.toString()))}async buildSetMinStakeAmountTxRaw(t){return await this.contract.setMinStakeAmount.populateTransaction(t)}async buildSetMinStakeAmountTx(t){return await this.buildSetMinStakeAmountTxRaw(e.ethers.parseEther(t.toString()))}async buildAddSignerTx(t){return await this.contract.addSigner.populateTransaction(t)}async buildRemoveSignerTx(t){return await this.contract.removeSigner.populateTransaction(t)}async buildPauseTx(){return await this.contract.pause.populateTransaction()}async buildUnpauseTx(){return await this.contract.unpause.populateTransaction()}async buildEmergencyUnstakeTx(t){return await this.contract.emergencyUnstake.populateTransaction(t)}async getTotalStakedRaw(){return await this.contract.totalStaked()}async getTotalStaked(){const t=await this.getTotalStakedRaw();return Number(e.ethers.formatEther(t))}async getTotalRewardsRaw(){return await this.contract.totalRewards()}async getTotalRewards(){const t=await this.getTotalRewardsRaw();return Number(e.ethers.formatEther(t))}async getMaxRewardAmountRaw(){return await this.contract.maxRewardAmount()}async getMaxRewardAmount(){const t=await this.getMaxRewardAmountRaw();return Number(e.ethers.formatEther(t))}async getMinStakeAmountRaw(){return await this.contract.minStakeAmount()}async getMinStakeAmount(){const t=await this.getMinStakeAmountRaw();return Number(e.ethers.formatEther(t))}async getUserInfoRaw(t){const[e,a]=await this.contract.getUserInfo(t);return{stake:e,harvested:a}}async getUserInfo(t){const{stake:a,harvested:r}=await this.getUserInfoRaw(t);return{stake:Number(e.ethers.formatEther(a)),harvested:Number(e.ethers.formatEther(r))}}async getUserStakeRaw(t){return await this.contract.userStakes(t)}async getUserStake(t){const a=await this.getUserStakeRaw(t);return Number(e.ethers.formatEther(a))}async getUserTotalRewardsHarvestedRaw(t){return await this.contract.userTotalRewardsHarvested(t)}async getUserTotalRewardsHarvested(t){const a=await this.getUserTotalRewardsHarvestedRaw(t);return Number(e.ethers.formatEther(a))}async isPaused(){return await this.contract.paused()}async getOperatorRoleHash(){return await this.contract.OPERATOR_ROLE()}async getSignerRoleHash(){return await this.contract.SIGNER_ROLE()}async getAdminRoleHash(){return await this.contract.DEFAULT_ADMIN_ROLE()}async hasOperatorRole(t){const e=await this.contract.OPERATOR_ROLE();return await this.contract.hasRole(e,t)}async hasSignerRole(t){const e=await this.contract.SIGNER_ROLE();return await this.contract.hasRole(e,t)}async hasAdminRole(t){const e=await this.contract.DEFAULT_ADMIN_ROLE();return await this.contract.hasRole(e,t)}async createRewardSignature(t,a,r,s,n,i){const o=e.ethers.parseEther(r.toString()),c=e.ethers.solidityPackedKeccak256(["address","address","uint256","uint256","uint256"],[t,a,o,s,n]),u=new e.ethers.Wallet(i);return{signature:await u.signMessage(e.ethers.getBytes(c)),messageHash:c.toString()}}getContractAddress(){return this.contractAddress}async getAllEvents(t,e,a){return await this.bootstrap(),(0,s.getAllEvents)(this.contract,(()=>this.getRandomProvider()),(()=>this.getContractWithRandomProvider()),t,e,a)}async streamEvents(t,e,a,r=1e3,n=5e3,i=0){const
|
1
|
+
"use strict";var t=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.EthStakingSDK=void 0;const e=require("ethers"),a=t(require("./abis/EthStaking.json")),r=t(require("./contracts.json")),s=require("./utils");exports.EthStakingSDK=class{constructor(t,n){this.name="EthStaking",this.isBootstrapped=!1,this.formatEventArgs=t=>{const{eventName:a,args:r}=t;switch(a){case"Staked":case"Unstaked":return{...t,args:{...r,user:r.user.toLowerCase(),amount:Number(e.ethers.formatEther(r.amount)),timestamp:Number(r.timestamp)}};case"RewardHarvested":return{...t,args:{...r,user:r.user.toLowerCase(),amount:Number(e.ethers.formatEther(r.amount)),timestamp:Number(r.timestamp),signatureHash:r.signatureHash}};case"SignerUpdated":return{...t,args:{...r,newSigner:r.newSigner.toLowerCase()}};case"MinStakeUpdated":return{...t,args:{...r,oldAmount:Number(e.ethers.formatEther(r.oldAmount)),newAmount:Number(e.ethers.formatEther(r.newAmount))}};default:return t}};const i=Array.isArray(t)?t:[t];this.providers=i.map((t=>new e.ethers.JsonRpcProvider(t,void 0,{staticNetwork:!0})));const o=(0,s.getRandomProvider)(this.providers);this.contractAddress=(0,s.resolveContractAddress)(i[0],this.name,r.default,n),this.contract=new e.ethers.Contract(this.contractAddress,a.default.abi,o)}getRandomProvider(){return(0,s.getRandomProvider)(this.providers)}getContractWithRandomProvider(){return new e.ethers.Contract(this.contractAddress,a.default.abi,this.getRandomProvider())}async bootstrap(){if(this.isBootstrapped)return;const t=await Promise.all(this.providers.map(((t,e)=>(0,s.checkRpcHealth)(t,e))));if(this.providers=this.providers.filter(((e,a)=>t[a])),0===this.providers.length)throw new Error("No active RPC providers available");this.isBootstrapped=!0}async signAndSendTransaction(t,e,a={}){return(0,s.signAndSendTransaction)(t,e,(()=>this.getRandomProvider()),a,this.contract)}async buildStakeTxRaw(t){return await this.contract.stake.populateTransaction({value:t})}async buildStakeTx(t){return await this.buildStakeTxRaw(e.ethers.parseEther(t.toString()))}async buildUnstakeTxRaw(t){return await this.contract.unstake.populateTransaction(t)}async buildUnstakeTx(t){return await this.buildUnstakeTxRaw(e.ethers.parseEther(t.toString()))}async buildHarvestRewardTxRaw(t,e,a,r){return await this.contract.harvestReward.populateTransaction(t,e,a,r)}async buildHarvestRewardTx(t,a,r,s){return await this.buildHarvestRewardTxRaw(e.ethers.parseEther(t.toString()),BigInt(a),BigInt(r),s)}async buildUnstakeAndHarvestTxRaw(t,e,a,r,s){return await this.contract.unstakeAndHarvest.populateTransaction(t,e,a,r,s)}async buildUnstakeAndHarvestTx(t,a,r,s,n){return await this.buildUnstakeAndHarvestTxRaw(e.ethers.parseEther(t.toString()),e.ethers.parseEther(a.toString()),BigInt(r),BigInt(s),n)}async buildAddRewardsTxRaw(t){return await this.contract.addRewards.populateTransaction({value:t})}async buildAddRewardsTx(t){return await this.buildAddRewardsTxRaw(e.ethers.parseEther(t.toString()))}async buildUpdateMaxRewardAmountTxRaw(t){return await this.contract.updateMaxRewardAmount.populateTransaction(t)}async buildUpdateMaxRewardAmountTx(t){return await this.buildUpdateMaxRewardAmountTxRaw(e.ethers.parseEther(t.toString()))}async buildSetMinStakeAmountTxRaw(t){return await this.contract.setMinStakeAmount.populateTransaction(t)}async buildSetMinStakeAmountTx(t){return await this.buildSetMinStakeAmountTxRaw(e.ethers.parseEther(t.toString()))}async buildAddSignerTx(t){return await this.contract.addSigner.populateTransaction(t)}async buildRemoveSignerTx(t){return await this.contract.removeSigner.populateTransaction(t)}async buildPauseTx(){return await this.contract.pause.populateTransaction()}async buildUnpauseTx(){return await this.contract.unpause.populateTransaction()}async buildEmergencyUnstakeTx(t){return await this.contract.emergencyUnstake.populateTransaction(t)}async getTotalStakedRaw(){return await this.contract.totalStaked()}async getTotalStaked(){const t=await this.getTotalStakedRaw();return Number(e.ethers.formatEther(t))}async getTotalRewardsRaw(){return await this.contract.totalRewards()}async getTotalRewards(){const t=await this.getTotalRewardsRaw();return Number(e.ethers.formatEther(t))}async getMaxRewardAmountRaw(){return await this.contract.maxRewardAmount()}async getMaxRewardAmount(){const t=await this.getMaxRewardAmountRaw();return Number(e.ethers.formatEther(t))}async getMinStakeAmountRaw(){return await this.contract.minStakeAmount()}async getMinStakeAmount(){const t=await this.getMinStakeAmountRaw();return Number(e.ethers.formatEther(t))}async getUserInfoRaw(t){const[e,a]=await this.contract.getUserInfo(t);return{stake:e,harvested:a}}async getUserInfo(t){const{stake:a,harvested:r}=await this.getUserInfoRaw(t);return{stake:Number(e.ethers.formatEther(a)),harvested:Number(e.ethers.formatEther(r))}}async getUserStakeRaw(t){return await this.contract.userStakes(t)}async getUserStake(t){const a=await this.getUserStakeRaw(t);return Number(e.ethers.formatEther(a))}async getUserTotalRewardsHarvestedRaw(t){return await this.contract.userTotalRewardsHarvested(t)}async getUserTotalRewardsHarvested(t){const a=await this.getUserTotalRewardsHarvestedRaw(t);return Number(e.ethers.formatEther(a))}async isPaused(){return await this.contract.paused()}async getOperatorRoleHash(){return await this.contract.OPERATOR_ROLE()}async getSignerRoleHash(){return await this.contract.SIGNER_ROLE()}async getAdminRoleHash(){return await this.contract.DEFAULT_ADMIN_ROLE()}async hasOperatorRole(t){const e=await this.contract.OPERATOR_ROLE();return await this.contract.hasRole(e,t)}async hasSignerRole(t){const e=await this.contract.SIGNER_ROLE();return await this.contract.hasRole(e,t)}async hasAdminRole(t){const e=await this.contract.DEFAULT_ADMIN_ROLE();return await this.contract.hasRole(e,t)}async createRewardSignature(t,a,r,s,n,i){const o=e.ethers.parseEther(r.toString()),c=e.ethers.solidityPackedKeccak256(["address","address","uint256","uint256","uint256"],[t,a,o,s,n]),u=new e.ethers.Wallet(i);return{signature:await u.signMessage(e.ethers.getBytes(c)),messageHash:c.toString()}}getContractAddress(){return this.contractAddress}async getAllEvents(t,e,a){return await this.bootstrap(),(0,s.getAllEvents)(this.contract,(()=>this.getRandomProvider()),(()=>this.getContractWithRandomProvider()),t,e,a)}async streamEvents(t,e,a,r=1e3,n=5e3,i=0,o){const c=["Staked","Unstaked","RewardHarvested","SignerUpdated","MinStakeUpdated"];return await this.bootstrap(),(0,s.streamEvents)({getProvider:()=>this.getRandomProvider(),getAllEvents:(t,e)=>this.getAllEvents(t,e,c),formatEvent:t=>this.formatEventArgs(t),onEvent:e,saveLatestBlock:a,fromBlock:t,batchSize:r,sleepTime:n,blockGap:i,shouldContinue:o})}};
|
package/dist/TradingVault.d.ts
CHANGED
@@ -209,6 +209,71 @@ export declare class TradingVaultSDK {
|
|
209
209
|
getTotalAmountRaw(): Promise<bigint>;
|
210
210
|
getTotalBorrowed(): Promise<number>;
|
211
211
|
getTotalBorrowedRaw(): Promise<bigint>;
|
212
|
+
/**
|
213
|
+
* Gets the total debt of all users
|
214
|
+
*
|
215
|
+
* @returns The total debt as a number
|
216
|
+
*
|
217
|
+
* @example
|
218
|
+
* ```typescript
|
219
|
+
* const totalDebt = await sdk.getTotalUserDebt();
|
220
|
+
* ```
|
221
|
+
*/
|
222
|
+
getTotalUserDebt(): Promise<number>;
|
223
|
+
/**
|
224
|
+
* Gets the total debt of all users in raw format
|
225
|
+
*
|
226
|
+
* @returns The total debt as a bigint
|
227
|
+
*
|
228
|
+
* @example
|
229
|
+
* ```typescript
|
230
|
+
* const totalDebtRaw = await sdk.getTotalUserDebtRaw();
|
231
|
+
* ```
|
232
|
+
*/
|
233
|
+
getTotalUserDebtRaw(): Promise<bigint>;
|
234
|
+
/**
|
235
|
+
* Gets the debt of a specific user
|
236
|
+
*
|
237
|
+
* @param userAddress - The address of the user
|
238
|
+
* @returns The user's debt as a number
|
239
|
+
*
|
240
|
+
* @example
|
241
|
+
* ```typescript
|
242
|
+
* const userDebt = await sdk.getUserDebt("0x...");
|
243
|
+
* ```
|
244
|
+
*/
|
245
|
+
getUserDebt(userAddress: string): Promise<number>;
|
246
|
+
/**
|
247
|
+
* Gets the debt of a specific user in raw format
|
248
|
+
*
|
249
|
+
* @param userAddress - The address of the user
|
250
|
+
* @returns The user's debt as a bigint
|
251
|
+
*
|
252
|
+
* @example
|
253
|
+
* ```typescript
|
254
|
+
* const userDebtRaw = await sdk.getUserDebtRaw("0x...");
|
255
|
+
* ```
|
256
|
+
*/
|
257
|
+
getUserDebtRaw(userAddress: string): Promise<bigint>;
|
258
|
+
/**
|
259
|
+
* Builds a transaction to repay user debt
|
260
|
+
*
|
261
|
+
* @param amount - Amount of reward tokens to use for debt repayment
|
262
|
+
* @returns Populated transaction
|
263
|
+
*
|
264
|
+
* @example
|
265
|
+
* ```typescript
|
266
|
+
* const tx = await sdk.buildRepayUserDebtTx(100);
|
267
|
+
* ```
|
268
|
+
*/
|
269
|
+
buildRepayUserDebtTx(amount: number): Promise<ethers.ContractTransaction>;
|
270
|
+
/**
|
271
|
+
* Builds a raw transaction to repay user debt
|
272
|
+
*
|
273
|
+
* @param amount - Amount of reward tokens as bigint
|
274
|
+
* @returns Populated transaction
|
275
|
+
*/
|
276
|
+
buildRepayUserDebtTxRaw(amount: bigint): Promise<ethers.ContractTransaction>;
|
212
277
|
isReduceEnabled(): Promise<boolean>;
|
213
278
|
getPosition(tokenId: bigint): Promise<{
|
214
279
|
remainingAmount: number;
|
package/dist/TradingVault.js
CHANGED
@@ -1 +1 @@
|
|
1
|
-
"use strict";var t=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.TradingVaultSDK=void 0;const e=require("ethers"),r=t(require("./abis/TradingVault.json")),a=t(require("./contracts.json")),n=require("./utils");exports.TradingVaultSDK=class{constructor(t,i){this.name="TradingVault",this._currency=null,this._rewardToken=null,this._currencyDecimals=null,this._rewardTokenDecimals=null,this.priceDecimals=6,this.isBootstrapped=!1,this.configs=[],this.BASE_WEIGHT=1e4,this.BASE_PRICE=100,this.formatEventArgs=t=>{const e=this._currencyDecimals,r=this._rewardTokenDecimals,{eventName:a,args:n}=t;switch(a){case"PositionCreated":return{...t,args:{...n,user:n.user.toLowerCase(),amount:Number(n.amount)/Math.pow(10,e),entryPrice:Number(n.entryPrice)/Math.pow(10,this.priceDecimals),tokenId:Number(n.tokenId),openedAt:Number(n.openedAt),expiredAt:Number(n.expiredAt),currency:n.currency.toLowerCase()}};case"EntryPriceUpdated":return{...t,args:{...n,tokenId:Number(n.tokenId),oldEntryPrice:Number(n.oldEntryPrice)/Math.pow(10,this.priceDecimals),newEntryPrice:Number(n.newEntryPrice)/Math.pow(10,this.priceDecimals)}};case"PositionExpirationUpdated":return{...t,args:{...n,tokenId:Number(n.tokenId),expiredAt:Number(n.expiredAt)}};case"PositionReduced":return{...t,args:{...n,user:n.user.toLowerCase(),reducedAmount:Number(n.reducedAmount)/Math.pow(10,e),remainingAmount:Number(n.remainingAmount)/Math.pow(10,e),totalReward:Number(n.totalReward)/Math.pow(10,r),userReward:Number(n.userReward)/Math.pow(10,r),treasuryReward:Number(n.treasuryReward)/Math.pow(10,r),rewardedAmount:Number(n.rewardedAmount)/Math.pow(10,r),weight:Number(n.weight),tokenId:Number(n.tokenId),lossAmount:Number(n.lossAmount)/Math.pow(10,e),price:Number(n.price)/Math.pow(10,this.priceDecimals),loss:Number(n.loss)/Math.pow(10,e)}};case"CurrencyBorrowed":case"CurrencyRepaid":return{...t,args:{...n,amount:Number(n.amount)/Math.pow(10,e),borrower:n.borrower.toLowerCase()}};case"PriceUpdated":return{...t,args:{...n,oldPrice:Number(n.oldPrice)/Math.pow(10,this.priceDecimals),newPrice:Number(n.newPrice)/Math.pow(10,this.priceDecimals),requiredReward:Number(n.requiredReward)/Math.pow(10,r),timestamp:Number(n.timestamp)}};case"TotalAmountUpdated":return{...t,args:{...n,newTotalAmount:Number(n.newTotalAmount)/Math.pow(10,e)}};case"CurrencyUpdated":return{...t,args:{...n,oldCurrency:n.oldCurrency.toLowerCase(),newCurrency:n.newCurrency.toLowerCase()}};case"RewardTokenUpdated":return{...t,args:{...n,oldRewardToken:n.oldRewardToken.toLowerCase(),newRewardToken:n.newRewardToken.toLowerCase()}};case"ReduceEnabledUpdated":return{...t,args:{...n,enabled:n.enabled}};case"TreasuryUpdated":return{...t,args:{...n,oldTreasury:n.oldTreasury.toLowerCase(),newTreasury:n.newTreasury.toLowerCase()}};case"RewardConfigsUpdated":return{...t,args:{...n}};case"TotalRewardsUpdated":case"TotalRewardsHarvestedUpdated":return{...t,args:{...n,oldAmount:Number(n.oldAmount)/Math.pow(10,r),newAmount:Number(n.newAmount)/Math.pow(10,r)}};case"Transfer":return{...t,args:{...n,from:n.from.toLowerCase(),to:n.to.toLowerCase(),value:Number(n.value)}};default:return t}};const o=Array.isArray(t)?t:[t];this.providers=o.map((t=>new e.ethers.JsonRpcProvider(t,void 0,{staticNetwork:!0})));const s=(0,n.getRandomProvider)(this.providers);this.contractAddress=(0,n.resolveContractAddress)(o[0],this.name,a.default,i),this.contract=new e.ethers.Contract(this.contractAddress,r.default.abi,s)}getRandomProvider(){return(0,n.getRandomProvider)(this.providers)}getContractWithRandomProvider(){return new e.ethers.Contract(this.contractAddress,r.default.abi,this.getRandomProvider())}async bootstrap(){if(this.isBootstrapped)return;const t=await Promise.all(this.providers.map(((t,e)=>(0,n.checkRpcHealth)(t,e))));if(this.providers=this.providers.filter(((e,r)=>t[r])),0===this.providers.length)throw new Error("No active RPC providers available");await Promise.all([this.getCurrencyDecimals(),this.getRewardTokenDecimals(),(async()=>{const t=await this.getRewardConfigsLength(),e=[];for(let r=0;r<t;r++)e.push(this.getRewardConfig(r));const r=await Promise.all(e);this.configs=r.map((t=>({weight:Number(t.weight)/this.BASE_WEIGHT,duration:Number(t.duration)})))})()]),this.isBootstrapped=!0}async signAndSendTransaction(t,e,r={}){return(0,n.signAndSendTransaction)(t,e,(()=>this.getRandomProvider()),r,this.contract)}async buildCreatePositionTx(t,e,r=0){const a=await this.getCurrencyDecimals(),n=BigInt(Math.floor(t*Math.pow(10,a)));return this.buildCreatePositionTxRaw(n,e,BigInt(r))}async buildReducePositionTx(t,e){const r=await this.getCurrencyDecimals(),a=BigInt(Math.floor(e*Math.pow(10,r)));return this.buildReducePositionTxRaw(t,a)}async buildReducePositionsTx(t,e){const r=await this.getCurrencyDecimals(),a=e.map((t=>BigInt(Math.floor(t*Math.pow(10,r)))));return this.buildReducePositionsTxRaw(t,a)}async buildBorrowCurrencyTx(t){const e=await this.getCurrencyDecimals(),r=BigInt(Math.floor(t*Math.pow(10,e)));return this.buildBorrowCurrencyTxRaw(r)}async buildRepayCurrencyTx(t){const e=await this.getCurrencyDecimals(),r=BigInt(Math.floor(t*Math.pow(10,e)));return this.buildRepayCurrencyTxRaw(r)}async buildSetPriceTx(t){const e=BigInt(Math.round(t*Math.pow(10,this.priceDecimals)));return await this.buildSetPriceTxRaw(e)}async buildBatchEmitPriceUpdatedTx(t){const e=t.map((t=>({price:BigInt(Math.round(t.price*Math.pow(10,this.priceDecimals))),timestamp:BigInt(t.timestamp)})));return await this.buildBatchEmitPriceUpdatedTxRaw(e)}async buildBatchEmitPriceUpdatedTxRaw(t){return await this.contract.batchEmitPriceUpdated.populateTransaction(t)}async buildClaimERC20Tx(t,r){const a=new e.ethers.Contract(t,["function decimals() view returns (uint8)"],this.getRandomProvider()),n=await a.decimals(),i=BigInt(Math.floor(r*Math.pow(10,n)));return this.buildClaimERC20TxRaw(t,i)}async buildCreatePositionTxRaw(t,e,r=0n){return await this.contract.createPosition.populateTransaction(t,e,r)}async buildReducePositionTxRaw(t,e){return await this.contract.reducePosition.populateTransaction(t,e)}async buildReducePositionsTxRaw(t,e){return await this.contract.reducePositions.populateTransaction(t,e)}async buildBorrowCurrencyTxRaw(t){return await this.contract.borrowCurrency.populateTransaction(t)}async buildRepayCurrencyTxRaw(t){return await this.contract.repayCurrency.populateTransaction(t)}async buildSetPriceTxRaw(t){return await this.contract.setPrice.populateTransaction(t)}async buildSetCurrencyTxRaw(t){this._currency=null;return await this.contract.setCurrency.populateTransaction(t)}async buildSetRewardTokenTxRaw(t){this._rewardToken=null;return await this.contract.setRewardToken.populateTransaction(t)}async buildSetTreasuryTxRaw(t){return await this.contract.setTreasury.populateTransaction(t)}async buildUpdateRewardConfigsTxRaw(t){return await this.contract.updateRewardConfigs.populateTransaction(t)}async buildSetReduceEnabledTxRaw(t){return await this.contract.setReduceEnabled.populateTransaction(t)}async buildClaimERC20TxRaw(t,e){return await this.contract.claimERC20.populateTransaction(t,e)}async buildApproveERC20Tx(t,r,a){const n=new e.ethers.Contract(t,["function decimals() view returns (uint8)"],this.getRandomProvider()),i=await n.decimals(),o=BigInt(Math.floor(a*Math.pow(10,Number(i))));return this.buildApproveERC20TxRaw(t,r,o)}async buildApproveERC20TxRaw(t,e,r){return await(0,n.buildApproveERC20Tx)(t,e,r,this.getRandomProvider())}async getAllowanceRaw(t,e,r){return await(0,n.getTokenAllowance)(t,e,r,this.getRandomProvider())}async getAllowance(t,e,r){const[a,i]=await Promise.all([this.getAllowanceRaw(t,e,r),(0,n.getTokenDecimals)(t,this.getRandomProvider())]);return Number(a)/Math.pow(10,i)}async buildGrantOperatorRoleTxRaw(t){return await this.contract.grantOperatorRole.populateTransaction(t)}async getOperatorRoleHash(){return await this.contract.OPERATOR_ROLE()}async hasOperatorRole(t){const e=await this.contract.OPERATOR_ROLE();return await this.contract.hasRole(e,t)}async buildGrantOperatorRoleTx(t){return await this.contract.grantOperatorRole.populateTransaction(t)}async getPriceSetterRoleHash(){return await this.contract.PRICE_SETTER_ROLE()}async hasPriceSetterRole(t){const e=await this.contract.PRICE_SETTER_ROLE();return await this.contract.hasRole(e,t)}async buildGrantPriceSetterRoleTx(t){return await this.contract.grantPriceSetterRole.populateTransaction(t)}async getAdminRoleHash(){return await this.contract.DEFAULT_ADMIN_ROLE()}async hasAdminRole(t){const e=await this.contract.DEFAULT_ADMIN_ROLE();return await this.contract.hasRole(e,t)}async buildGrantAdminRoleTx(t){const e=await this.contract.DEFAULT_ADMIN_ROLE();return await this.contract.grantRole.populateTransaction(e,t)}async getPrice(){const t=await this.getPriceRaw(),e=this.priceDecimals;return Number(t)/Math.pow(10,e)}async getPriceRaw(){return await this.contract.price()}async getCurrency(){return this._currency||(this._currency=await this.contract.currency()),this._currency}async getRewardToken(){return this._rewardToken||(this._rewardToken=await this.contract.rewardToken()),this._rewardToken}async getTreasury(){return await this.contract.treasury()}async getTotalAmount(){const t=await this.getTotalAmountRaw(),e=await this.getCurrencyDecimals();return Number(t)/Math.pow(10,e)}async getTotalAmountRaw(){return await this.contract.totalAmount()}async getTotalBorrowed(){const t=await this.getTotalBorrowedRaw(),e=await this.getCurrencyDecimals();return Number(t)/Math.pow(10,e)}async getTotalBorrowedRaw(){return await this.contract.totalBorrowed()}async isReduceEnabled(){return await this.contract.isReduceEnabled()}async getPosition(t){const e=await this.getPositionRaw(t),r=await this.getCurrencyDecimals(),a=await this.getRewardTokenDecimals(),n=this.priceDecimals;return{remainingAmount:Number(e.remainingAmount)/Math.pow(10,r),entryPrice:Number(e.entryPrice)/Math.pow(10,n),outPrice:Number(e.outPrice)/Math.pow(10,n),openedAt:Number(e.openedAt),closedAt:Number(e.closedAt),rewardedAmount:Number(e.rewardedAmount)/Math.pow(10,a),lossAmount:Number(e.lossAmount)/Math.pow(10,r),initAmount:Number(e.initAmount)/Math.pow(10,r),expiredAt:Number(e.expiredAt)}}async getPositionRaw(t){return await this.contract.positions(t)}async getRewardConfig(t){return await this.contract.rewardConfigs(t)}async getRewardConfigsLength(){return await this.contract.getRewardConfigsLength()}async getCurrencyDecimals(){if(null===this._currencyDecimals){const t=await this.getCurrency(),r=new e.ethers.Contract(t,["function decimals() view returns (uint8)"],this.getRandomProvider());this._currencyDecimals=Number(await r.decimals())}return this._currencyDecimals}async getRewardTokenDecimals(){if(null===this._rewardTokenDecimals){const t=await this.getRewardToken(),r=new e.ethers.Contract(t,["function decimals() view returns (uint8)"],this.getRandomProvider());this._rewardTokenDecimals=Number(await r.decimals())}return this._rewardTokenDecimals}async getERC721BalanceOf(t){const e=await this.getERC721BalanceOfRaw(t);return Number(e)}async getERC721BalanceOfRaw(t){return await this.contract.balanceOf(t)}getContractAddress(){return this.contractAddress}getConfigs(){return[...this.configs]}async getAllEvents(t,e,r){return await this.bootstrap(),(0,n.getAllEvents)(this.contract,(()=>this.getRandomProvider()),(()=>this.getContractWithRandomProvider()),t,e,r)}async streamEvents(t,e,r,a=1e3,i=5e3,o=0){const s=["CurrencyBorrowed","CurrencyRepaid","CurrencyUpdated","EntryPriceUpdated","PositionCreated","PositionExpirationUpdated","PositionReduced","PriceUpdated","ReduceEnabledUpdated","RewardConfigsUpdated","RewardTokenUpdated","TotalAmountUpdated","TotalRewardsHarvestedUpdated","TotalRewardsUpdated","Transfer","TreasuryUpdated"];return await this.bootstrap(),(0,n.streamEvents)({getProvider:()=>this.getRandomProvider(),getAllEvents:(t,e)=>this.getAllEvents(t,e,s),formatEvent:t=>this.formatEventArgs(t),onEvent:e,saveLatestBlock:r,fromBlock:t,batchSize:a,sleepTime:i,blockGap:o})}estimateUnrealizedPnl({price:t,entryPrice:e,initAmount:r,remainingAmount:a}){const n=a*(t-e)/this.BASE_PRICE;return{pnl:n,pnlPercentage:n/r*100}}estReducePosition({amount:t,price:e,entryPrice:r,openedAt:a,configs:n=[]}){const i=this.BASE_PRICE;this.BASE_WEIGHT;let o=t,s=0,c=0,u=0,d=0;if(e<r){return o=t-t*(r-e)/100,{amount:o,totalReward:0,userReward:0,treasuryReward:0,weight:0}}if(e>=r){s=t*(e-r)/i;const o=Math.floor(Date.now()/1e3)-a;d=this.getRewardWeight(o,n),c=s*d,u=s-c}return{amount:o,totalReward:s,userReward:c,treasuryReward:u,weight:d}}estReducePositions({positions:t,price:e,configs:r=[]}){return t.map((t=>this.estReducePosition({amount:t.amount,price:e,entryPrice:t.entryPrice,openedAt:t.openedAt,configs:r}))).reduce(((t,e)=>({amount:t.amount+e.amount,totalReward:t.totalReward+e.totalReward,userReward:t.userReward+e.userReward,treasuryReward:t.treasuryReward+e.treasuryReward})),{amount:0,totalReward:0,userReward:0,treasuryReward:0})}getRewardWeight(t,e){return(0,n.getRewardWeight)(t,e)}estimateUnrealizedPnls({price:t,positions:e}){return e.reduce(((e,r)=>{const{pnl:a}=this.estimateUnrealizedPnl({price:t,...r});return{totalInitAmount:e.totalInitAmount+r.initAmount,totalRemainingAmount:e.totalRemainingAmount+r.remainingAmount,totalRewardedAmount:e.totalRewardedAmount+r.rewardedAmount,totalLossAmount:e.totalLossAmount+r.lossAmount,totalPnl:e.totalPnl+a}}),{totalInitAmount:0,totalRemainingAmount:0,totalRewardedAmount:0,totalLossAmount:0,totalPnl:0})}async buildAddReward(t){const e=await this.getRewardTokenDecimals(),r=BigInt(Math.floor(t*Math.pow(10,e)));return this.buildAddRewardTxRaw(r)}async buildAddRewardTxRaw(t){return await this.contract.addReward.populateTransaction(t)}async ownerOf(t){const e="number"==typeof t?BigInt(t):t;return await this.contract.ownerOf(e)}async isOwnerOf(t,e){try{return(await this.ownerOf(t)).toLowerCase()===e.toLowerCase()}catch(t){return!1}}async buildSetPositionExpirationTx(t,e){return this.buildSetPositionExpirationTxRaw(BigInt(t),BigInt(e))}async buildSetPositionExpirationTxRaw(t,e){return await this.contract.setPositionExpiration.populateTransaction(t,e)}async buildBatchSetPositionExpirationTx(t,e){const r=t.map((t=>BigInt(t))),a=e.map((t=>BigInt(t)));return this.buildBatchSetPositionExpirationTxRaw(r,a)}async buildBatchSetPositionExpirationTxRaw(t,e){return await this.contract.batchSetPositionExpiration.populateTransaction(t,e)}async buildUpdateEntryPriceTx(t,e){const r=BigInt(Math.round(e*Math.pow(10,this.priceDecimals)));return this.buildUpdateEntryPriceTxRaw(BigInt(t),r)}async buildUpdateEntryPriceTxRaw(t,e){return await this.contract.updateEntryPrice.populateTransaction(t,e)}async buildBatchUpdateEntryPriceTx(t,e){const r=t.map((t=>BigInt(t))),a=e.map((t=>BigInt(Math.round(t*Math.pow(10,this.priceDecimals)))));return this.buildBatchUpdateEntryPriceTxRaw(r,a)}async buildBatchUpdateEntryPriceTxRaw(t,e){return await this.contract.batchUpdateEntryPrice.populateTransaction(t,e)}async buildCloseExpiredPositionTx(t,e){const r=BigInt(Math.round(e*Math.pow(10,this.priceDecimals)));return this.buildCloseExpiredPositionTxRaw(BigInt(t),r)}async buildCloseExpiredPositionTxRaw(t,e){return await this.contract.closeExpiredPosition.populateTransaction(t,e)}};
|
1
|
+
"use strict";var t=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.TradingVaultSDK=void 0;const e=require("ethers"),a=t(require("./abis/TradingVault.json")),r=t(require("./contracts.json")),n=require("./utils");exports.TradingVaultSDK=class{constructor(t,i){this.name="TradingVault",this._currency=null,this._rewardToken=null,this._currencyDecimals=null,this._rewardTokenDecimals=null,this.priceDecimals=6,this.isBootstrapped=!1,this.configs=[],this.BASE_WEIGHT=1e4,this.BASE_PRICE=100,this.formatEventArgs=t=>{const e=this._currencyDecimals,a=this._rewardTokenDecimals,{eventName:r,args:n}=t;switch(r){case"PositionCreated":return{...t,args:{...n,user:n.user.toLowerCase(),amount:Number(n.amount)/Math.pow(10,e),entryPrice:Number(n.entryPrice)/Math.pow(10,this.priceDecimals),tokenId:Number(n.tokenId),openedAt:Number(n.openedAt),expiredAt:Number(n.expiredAt),currency:n.currency.toLowerCase()}};case"EntryPriceUpdated":return{...t,args:{...n,tokenId:Number(n.tokenId),oldEntryPrice:Number(n.oldEntryPrice)/Math.pow(10,this.priceDecimals),newEntryPrice:Number(n.newEntryPrice)/Math.pow(10,this.priceDecimals)}};case"PositionExpirationUpdated":return{...t,args:{...n,tokenId:Number(n.tokenId),expiredAt:Number(n.expiredAt)}};case"PositionReduced":return{...t,args:{...n,user:n.user.toLowerCase(),reducedAmount:Number(n.reducedAmount)/Math.pow(10,e),remainingAmount:Number(n.remainingAmount)/Math.pow(10,e),totalReward:Number(n.totalReward)/Math.pow(10,a),userReward:Number(n.userReward)/Math.pow(10,a),treasuryReward:Number(n.treasuryReward)/Math.pow(10,a),rewardedAmount:Number(n.rewardedAmount)/Math.pow(10,a),weight:Number(n.weight),tokenId:Number(n.tokenId),lossAmount:Number(n.lossAmount)/Math.pow(10,e),price:Number(n.price)/Math.pow(10,this.priceDecimals),loss:Number(n.loss)/Math.pow(10,e)}};case"CurrencyBorrowed":case"CurrencyRepaid":return{...t,args:{...n,amount:Number(n.amount)/Math.pow(10,e),borrower:n.borrower.toLowerCase()}};case"PriceUpdated":return{...t,args:{...n,oldPrice:Number(n.oldPrice)/Math.pow(10,this.priceDecimals),newPrice:Number(n.newPrice)/Math.pow(10,this.priceDecimals),requiredReward:Number(n.requiredReward)/Math.pow(10,a),timestamp:Number(n.timestamp)}};case"TotalAmountUpdated":return{...t,args:{...n,newTotalAmount:Number(n.newTotalAmount)/Math.pow(10,e)}};case"CurrencyUpdated":return{...t,args:{...n,oldCurrency:n.oldCurrency.toLowerCase(),newCurrency:n.newCurrency.toLowerCase()}};case"RewardTokenUpdated":return{...t,args:{...n,oldRewardToken:n.oldRewardToken.toLowerCase(),newRewardToken:n.newRewardToken.toLowerCase()}};case"ReduceEnabledUpdated":return{...t,args:{...n,enabled:n.enabled}};case"TreasuryUpdated":return{...t,args:{...n,oldTreasury:n.oldTreasury.toLowerCase(),newTreasury:n.newTreasury.toLowerCase()}};case"RewardConfigsUpdated":return{...t,args:{...n}};case"TotalRewardsUpdated":case"TotalRewardsHarvestedUpdated":return{...t,args:{...n,oldAmount:Number(n.oldAmount)/Math.pow(10,a),newAmount:Number(n.newAmount)/Math.pow(10,a)}};case"Transfer":return{...t,args:{...n,from:n.from.toLowerCase(),to:n.to.toLowerCase(),value:Number(n.value)}};default:return t}};const o=Array.isArray(t)?t:[t];this.providers=o.map((t=>new e.ethers.JsonRpcProvider(t,void 0,{staticNetwork:!0})));const s=(0,n.getRandomProvider)(this.providers);this.contractAddress=(0,n.resolveContractAddress)(o[0],this.name,r.default,i),this.contract=new e.ethers.Contract(this.contractAddress,a.default.abi,s)}getRandomProvider(){return(0,n.getRandomProvider)(this.providers)}getContractWithRandomProvider(){return new e.ethers.Contract(this.contractAddress,a.default.abi,this.getRandomProvider())}async bootstrap(){if(this.isBootstrapped)return;const t=await Promise.all(this.providers.map(((t,e)=>(0,n.checkRpcHealth)(t,e))));if(this.providers=this.providers.filter(((e,a)=>t[a])),0===this.providers.length)throw new Error("No active RPC providers available");await Promise.all([this.getCurrencyDecimals(),this.getRewardTokenDecimals(),(async()=>{const t=await this.getRewardConfigsLength(),e=[];for(let a=0;a<t;a++)e.push(this.getRewardConfig(a));const a=await Promise.all(e);this.configs=a.map((t=>({weight:Number(t.weight)/this.BASE_WEIGHT,duration:Number(t.duration)})))})()]),this.isBootstrapped=!0}async signAndSendTransaction(t,e,a={}){return(0,n.signAndSendTransaction)(t,e,(()=>this.getRandomProvider()),a,this.contract)}async buildCreatePositionTx(t,e,a=0){const r=await this.getCurrencyDecimals(),n=BigInt(Math.floor(t*Math.pow(10,r)));return this.buildCreatePositionTxRaw(n,e,BigInt(a))}async buildReducePositionTx(t,e){const a=await this.getCurrencyDecimals(),r=BigInt(Math.floor(e*Math.pow(10,a)));return this.buildReducePositionTxRaw(t,r)}async buildReducePositionsTx(t,e){const a=await this.getCurrencyDecimals(),r=e.map((t=>BigInt(Math.floor(t*Math.pow(10,a)))));return this.buildReducePositionsTxRaw(t,r)}async buildBorrowCurrencyTx(t){const e=await this.getCurrencyDecimals(),a=BigInt(Math.floor(t*Math.pow(10,e)));return this.buildBorrowCurrencyTxRaw(a)}async buildRepayCurrencyTx(t){const e=await this.getCurrencyDecimals(),a=BigInt(Math.floor(t*Math.pow(10,e)));return this.buildRepayCurrencyTxRaw(a)}async buildSetPriceTx(t){const e=BigInt(Math.round(t*Math.pow(10,this.priceDecimals)));return await this.buildSetPriceTxRaw(e)}async buildBatchEmitPriceUpdatedTx(t){const e=t.map((t=>({price:BigInt(Math.round(t.price*Math.pow(10,this.priceDecimals))),timestamp:BigInt(t.timestamp)})));return await this.buildBatchEmitPriceUpdatedTxRaw(e)}async buildBatchEmitPriceUpdatedTxRaw(t){return await this.contract.batchEmitPriceUpdated.populateTransaction(t)}async buildClaimERC20Tx(t,a){const r=new e.ethers.Contract(t,["function decimals() view returns (uint8)"],this.getRandomProvider()),n=await r.decimals(),i=BigInt(Math.floor(a*Math.pow(10,n)));return this.buildClaimERC20TxRaw(t,i)}async buildCreatePositionTxRaw(t,e,a=0n){return await this.contract.createPosition.populateTransaction(t,e,a)}async buildReducePositionTxRaw(t,e){return await this.contract.reducePosition.populateTransaction(t,e)}async buildReducePositionsTxRaw(t,e){return await this.contract.reducePositions.populateTransaction(t,e)}async buildBorrowCurrencyTxRaw(t){return await this.contract.borrowCurrency.populateTransaction(t)}async buildRepayCurrencyTxRaw(t){return await this.contract.repayCurrency.populateTransaction(t)}async buildSetPriceTxRaw(t){return await this.contract.setPrice.populateTransaction(t)}async buildSetCurrencyTxRaw(t){this._currency=null;return await this.contract.setCurrency.populateTransaction(t)}async buildSetRewardTokenTxRaw(t){this._rewardToken=null;return await this.contract.setRewardToken.populateTransaction(t)}async buildSetTreasuryTxRaw(t){return await this.contract.setTreasury.populateTransaction(t)}async buildUpdateRewardConfigsTxRaw(t){return await this.contract.updateRewardConfigs.populateTransaction(t)}async buildSetReduceEnabledTxRaw(t){return await this.contract.setReduceEnabled.populateTransaction(t)}async buildClaimERC20TxRaw(t,e){return await this.contract.claimERC20.populateTransaction(t,e)}async buildApproveERC20Tx(t,a,r){const n=new e.ethers.Contract(t,["function decimals() view returns (uint8)"],this.getRandomProvider()),i=await n.decimals(),o=BigInt(Math.floor(r*Math.pow(10,Number(i))));return this.buildApproveERC20TxRaw(t,a,o)}async buildApproveERC20TxRaw(t,e,a){return await(0,n.buildApproveERC20Tx)(t,e,a,this.getRandomProvider())}async getAllowanceRaw(t,e,a){return await(0,n.getTokenAllowance)(t,e,a,this.getRandomProvider())}async getAllowance(t,e,a){const[r,i]=await Promise.all([this.getAllowanceRaw(t,e,a),(0,n.getTokenDecimals)(t,this.getRandomProvider())]);return Number(r)/Math.pow(10,i)}async buildGrantOperatorRoleTxRaw(t){return await this.contract.grantOperatorRole.populateTransaction(t)}async getOperatorRoleHash(){return await this.contract.OPERATOR_ROLE()}async hasOperatorRole(t){const e=await this.contract.OPERATOR_ROLE();return await this.contract.hasRole(e,t)}async buildGrantOperatorRoleTx(t){return await this.contract.grantOperatorRole.populateTransaction(t)}async getPriceSetterRoleHash(){return await this.contract.PRICE_SETTER_ROLE()}async hasPriceSetterRole(t){const e=await this.contract.PRICE_SETTER_ROLE();return await this.contract.hasRole(e,t)}async buildGrantPriceSetterRoleTx(t){return await this.contract.grantPriceSetterRole.populateTransaction(t)}async getAdminRoleHash(){return await this.contract.DEFAULT_ADMIN_ROLE()}async hasAdminRole(t){const e=await this.contract.DEFAULT_ADMIN_ROLE();return await this.contract.hasRole(e,t)}async buildGrantAdminRoleTx(t){const e=await this.contract.DEFAULT_ADMIN_ROLE();return await this.contract.grantRole.populateTransaction(e,t)}async getPrice(){const t=await this.getPriceRaw(),e=this.priceDecimals;return Number(t)/Math.pow(10,e)}async getPriceRaw(){return await this.contract.price()}async getCurrency(){return this._currency||(this._currency=await this.contract.currency()),this._currency}async getRewardToken(){return this._rewardToken||(this._rewardToken=await this.contract.rewardToken()),this._rewardToken}async getTreasury(){return await this.contract.treasury()}async getTotalAmount(){const t=await this.getTotalAmountRaw(),e=await this.getCurrencyDecimals();return Number(t)/Math.pow(10,e)}async getTotalAmountRaw(){return await this.contract.totalAmount()}async getTotalBorrowed(){const t=await this.getTotalBorrowedRaw(),e=await this.getCurrencyDecimals();return Number(t)/Math.pow(10,e)}async getTotalBorrowedRaw(){return await this.contract.totalBorrowed()}async getTotalUserDebt(){const t=await this.getTotalUserDebtRaw(),e=await this.getRewardTokenDecimals();return Number(t)/Math.pow(10,e)}async getTotalUserDebtRaw(){return await this.contract.totalUserDebt()}async getUserDebt(t){const e=await this.getUserDebtRaw(t),a=await this.getRewardTokenDecimals();return Number(e)/Math.pow(10,a)}async getUserDebtRaw(t){return await this.contract.userDebt(t)}async buildRepayUserDebtTx(t){const e=await this.getRewardTokenDecimals(),a=BigInt(Math.floor(t*Math.pow(10,e)));return this.buildRepayUserDebtTxRaw(a)}async buildRepayUserDebtTxRaw(t){return await this.contract.repayUserDebt.populateTransaction(t)}async isReduceEnabled(){return await this.contract.isReduceEnabled()}async getPosition(t){const e=await this.getPositionRaw(t),a=await this.getCurrencyDecimals(),r=await this.getRewardTokenDecimals(),n=this.priceDecimals;return{remainingAmount:Number(e.remainingAmount)/Math.pow(10,a),entryPrice:Number(e.entryPrice)/Math.pow(10,n),outPrice:Number(e.outPrice)/Math.pow(10,n),openedAt:Number(e.openedAt),closedAt:Number(e.closedAt),rewardedAmount:Number(e.rewardedAmount)/Math.pow(10,r),lossAmount:Number(e.lossAmount)/Math.pow(10,a),initAmount:Number(e.initAmount)/Math.pow(10,a),expiredAt:Number(e.expiredAt)}}async getPositionRaw(t){return await this.contract.positions(t)}async getRewardConfig(t){return await this.contract.rewardConfigs(t)}async getRewardConfigsLength(){return await this.contract.getRewardConfigsLength()}async getCurrencyDecimals(){if(null===this._currencyDecimals){const t=await this.getCurrency(),a=new e.ethers.Contract(t,["function decimals() view returns (uint8)"],this.getRandomProvider());this._currencyDecimals=Number(await a.decimals())}return this._currencyDecimals}async getRewardTokenDecimals(){if(null===this._rewardTokenDecimals){const t=await this.getRewardToken(),a=new e.ethers.Contract(t,["function decimals() view returns (uint8)"],this.getRandomProvider());this._rewardTokenDecimals=Number(await a.decimals())}return this._rewardTokenDecimals}async getERC721BalanceOf(t){const e=await this.getERC721BalanceOfRaw(t);return Number(e)}async getERC721BalanceOfRaw(t){return await this.contract.balanceOf(t)}getContractAddress(){return this.contractAddress}getConfigs(){return[...this.configs]}async getAllEvents(t,e,a){return await this.bootstrap(),(0,n.getAllEvents)(this.contract,(()=>this.getRandomProvider()),(()=>this.getContractWithRandomProvider()),t,e,a)}async streamEvents(t,e,a,r=1e3,i=5e3,o=0){const s=["CurrencyBorrowed","CurrencyRepaid","CurrencyUpdated","EntryPriceUpdated","PositionCreated","PositionExpirationUpdated","PositionReduced","PriceUpdated","ReduceEnabledUpdated","RewardConfigsUpdated","RewardTokenUpdated","TotalAmountUpdated","TotalRewardsHarvestedUpdated","TotalRewardsUpdated","Transfer","TreasuryUpdated"];return await this.bootstrap(),(0,n.streamEvents)({getProvider:()=>this.getRandomProvider(),getAllEvents:(t,e)=>this.getAllEvents(t,e,s),formatEvent:t=>this.formatEventArgs(t),onEvent:e,saveLatestBlock:a,fromBlock:t,batchSize:r,sleepTime:i,blockGap:o})}estimateUnrealizedPnl({price:t,entryPrice:e,initAmount:a,remainingAmount:r}){const n=r*(t-e)/this.BASE_PRICE;return{pnl:n,pnlPercentage:n/a*100}}estReducePosition({amount:t,price:e,entryPrice:a,openedAt:r,configs:n=[]}){const i=this.BASE_PRICE;this.BASE_WEIGHT;let o=t,s=0,c=0,u=0,d=0;if(e<a){return o=t-t*(a-e)/100,{amount:o,totalReward:0,userReward:0,treasuryReward:0,weight:0}}if(e>=a){s=t*(e-a)/i;const o=Math.floor(Date.now()/1e3)-r;d=this.getRewardWeight(o,n),c=s*d,u=s-c}return{amount:o,totalReward:s,userReward:c,treasuryReward:u,weight:d}}estReducePositions({positions:t,price:e,configs:a=[]}){return t.map((t=>this.estReducePosition({amount:t.amount,price:e,entryPrice:t.entryPrice,openedAt:t.openedAt,configs:a}))).reduce(((t,e)=>({amount:t.amount+e.amount,totalReward:t.totalReward+e.totalReward,userReward:t.userReward+e.userReward,treasuryReward:t.treasuryReward+e.treasuryReward})),{amount:0,totalReward:0,userReward:0,treasuryReward:0})}getRewardWeight(t,e){return(0,n.getRewardWeight)(t,e)}estimateUnrealizedPnls({price:t,positions:e}){return e.reduce(((e,a)=>{const{pnl:r}=this.estimateUnrealizedPnl({price:t,...a});return{totalInitAmount:e.totalInitAmount+a.initAmount,totalRemainingAmount:e.totalRemainingAmount+a.remainingAmount,totalRewardedAmount:e.totalRewardedAmount+a.rewardedAmount,totalLossAmount:e.totalLossAmount+a.lossAmount,totalPnl:e.totalPnl+r}}),{totalInitAmount:0,totalRemainingAmount:0,totalRewardedAmount:0,totalLossAmount:0,totalPnl:0})}async buildAddReward(t){const e=await this.getRewardTokenDecimals(),a=BigInt(Math.floor(t*Math.pow(10,e)));return this.buildAddRewardTxRaw(a)}async buildAddRewardTxRaw(t){return await this.contract.addReward.populateTransaction(t)}async ownerOf(t){const e="number"==typeof t?BigInt(t):t;return await this.contract.ownerOf(e)}async isOwnerOf(t,e){try{return(await this.ownerOf(t)).toLowerCase()===e.toLowerCase()}catch(t){return!1}}async buildSetPositionExpirationTx(t,e){return this.buildSetPositionExpirationTxRaw(BigInt(t),BigInt(e))}async buildSetPositionExpirationTxRaw(t,e){return await this.contract.setPositionExpiration.populateTransaction(t,e)}async buildBatchSetPositionExpirationTx(t,e){const a=t.map((t=>BigInt(t))),r=e.map((t=>BigInt(t)));return this.buildBatchSetPositionExpirationTxRaw(a,r)}async buildBatchSetPositionExpirationTxRaw(t,e){return await this.contract.batchSetPositionExpiration.populateTransaction(t,e)}async buildUpdateEntryPriceTx(t,e){const a=BigInt(Math.round(e*Math.pow(10,this.priceDecimals)));return this.buildUpdateEntryPriceTxRaw(BigInt(t),a)}async buildUpdateEntryPriceTxRaw(t,e){return await this.contract.updateEntryPrice.populateTransaction(t,e)}async buildBatchUpdateEntryPriceTx(t,e){const a=t.map((t=>BigInt(t))),r=e.map((t=>BigInt(Math.round(t*Math.pow(10,this.priceDecimals)))));return this.buildBatchUpdateEntryPriceTxRaw(a,r)}async buildBatchUpdateEntryPriceTxRaw(t,e){return await this.contract.batchUpdateEntryPrice.populateTransaction(t,e)}async buildCloseExpiredPositionTx(t,e){const a=BigInt(Math.round(e*Math.pow(10,this.priceDecimals)));return this.buildCloseExpiredPositionTxRaw(BigInt(t),a)}async buildCloseExpiredPositionTxRaw(t,e){return await this.contract.closeExpiredPosition.populateTransaction(t,e)}};
|
@@ -820,6 +820,56 @@
|
|
820
820
|
"name": "TreasuryUpdated",
|
821
821
|
"type": "event"
|
822
822
|
},
|
823
|
+
{
|
824
|
+
"anonymous": false,
|
825
|
+
"inputs": [
|
826
|
+
{
|
827
|
+
"indexed": true,
|
828
|
+
"internalType": "address",
|
829
|
+
"name": "user",
|
830
|
+
"type": "address"
|
831
|
+
},
|
832
|
+
{
|
833
|
+
"indexed": false,
|
834
|
+
"internalType": "uint256",
|
835
|
+
"name": "debtAmount",
|
836
|
+
"type": "uint256"
|
837
|
+
},
|
838
|
+
{
|
839
|
+
"indexed": false,
|
840
|
+
"internalType": "uint256",
|
841
|
+
"name": "remainingDebt",
|
842
|
+
"type": "uint256"
|
843
|
+
}
|
844
|
+
],
|
845
|
+
"name": "UserDebtRepaid",
|
846
|
+
"type": "event"
|
847
|
+
},
|
848
|
+
{
|
849
|
+
"anonymous": false,
|
850
|
+
"inputs": [
|
851
|
+
{
|
852
|
+
"indexed": true,
|
853
|
+
"internalType": "address",
|
854
|
+
"name": "user",
|
855
|
+
"type": "address"
|
856
|
+
},
|
857
|
+
{
|
858
|
+
"indexed": false,
|
859
|
+
"internalType": "uint256",
|
860
|
+
"name": "oldDebt",
|
861
|
+
"type": "uint256"
|
862
|
+
},
|
863
|
+
{
|
864
|
+
"indexed": false,
|
865
|
+
"internalType": "uint256",
|
866
|
+
"name": "newDebt",
|
867
|
+
"type": "uint256"
|
868
|
+
}
|
869
|
+
],
|
870
|
+
"name": "UserDebtUpdated",
|
871
|
+
"type": "event"
|
872
|
+
},
|
823
873
|
{
|
824
874
|
"inputs": [],
|
825
875
|
"name": "BASE_WEIGHT",
|
@@ -1048,6 +1098,24 @@
|
|
1048
1098
|
"stateMutability": "nonpayable",
|
1049
1099
|
"type": "function"
|
1050
1100
|
},
|
1101
|
+
{
|
1102
|
+
"inputs": [
|
1103
|
+
{
|
1104
|
+
"internalType": "address[]",
|
1105
|
+
"name": "_users",
|
1106
|
+
"type": "address[]"
|
1107
|
+
},
|
1108
|
+
{
|
1109
|
+
"internalType": "uint256[]",
|
1110
|
+
"name": "_debts",
|
1111
|
+
"type": "uint256[]"
|
1112
|
+
}
|
1113
|
+
],
|
1114
|
+
"name": "batchUpdateUserDebt",
|
1115
|
+
"outputs": [],
|
1116
|
+
"stateMutability": "nonpayable",
|
1117
|
+
"type": "function"
|
1118
|
+
},
|
1051
1119
|
{
|
1052
1120
|
"inputs": [
|
1053
1121
|
{
|
@@ -1519,6 +1587,19 @@
|
|
1519
1587
|
"stateMutability": "nonpayable",
|
1520
1588
|
"type": "function"
|
1521
1589
|
},
|
1590
|
+
{
|
1591
|
+
"inputs": [
|
1592
|
+
{
|
1593
|
+
"internalType": "uint256",
|
1594
|
+
"name": "_amount",
|
1595
|
+
"type": "uint256"
|
1596
|
+
}
|
1597
|
+
],
|
1598
|
+
"name": "repayUserDebt",
|
1599
|
+
"outputs": [],
|
1600
|
+
"stateMutability": "nonpayable",
|
1601
|
+
"type": "function"
|
1602
|
+
},
|
1522
1603
|
{
|
1523
1604
|
"inputs": [
|
1524
1605
|
{
|
@@ -1829,6 +1910,19 @@
|
|
1829
1910
|
"stateMutability": "view",
|
1830
1911
|
"type": "function"
|
1831
1912
|
},
|
1913
|
+
{
|
1914
|
+
"inputs": [],
|
1915
|
+
"name": "totalUserDebt",
|
1916
|
+
"outputs": [
|
1917
|
+
{
|
1918
|
+
"internalType": "uint256",
|
1919
|
+
"name": "",
|
1920
|
+
"type": "uint256"
|
1921
|
+
}
|
1922
|
+
],
|
1923
|
+
"stateMutability": "view",
|
1924
|
+
"type": "function"
|
1925
|
+
},
|
1832
1926
|
{
|
1833
1927
|
"inputs": [
|
1834
1928
|
{
|
@@ -1920,10 +2014,29 @@
|
|
1920
2014
|
"outputs": [],
|
1921
2015
|
"stateMutability": "nonpayable",
|
1922
2016
|
"type": "function"
|
2017
|
+
},
|
2018
|
+
{
|
2019
|
+
"inputs": [
|
2020
|
+
{
|
2021
|
+
"internalType": "address",
|
2022
|
+
"name": "",
|
2023
|
+
"type": "address"
|
2024
|
+
}
|
2025
|
+
],
|
2026
|
+
"name": "userDebt",
|
2027
|
+
"outputs": [
|
2028
|
+
{
|
2029
|
+
"internalType": "uint256",
|
2030
|
+
"name": "",
|
2031
|
+
"type": "uint256"
|
2032
|
+
}
|
2033
|
+
],
|
2034
|
+
"stateMutability": "view",
|
2035
|
+
"type": "function"
|
1923
2036
|
}
|
1924
2037
|
],
|
1925
|
-
"bytecode": "0x6080806040523460d2577ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005460ff8160401c1660c1576002600160401b03196001600160401b03821601605c575b604051613ddb90816100d88239f35b6001600160401b0319166001600160401b039081177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005581527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a13880604d565b63f92ee8a960e01b60005260046000fd5b600080fdfe608080604052600436101561001357600080fd5b600090813560e01c90816301ffc9a7146129745750806303e0ac861461295857806306fdde03146128a9578063081812fc14612880578063095ea7b3146127865780630d8317e1146127685780630ead7712146127455780631a39d8ef1461272757806323b872dd1461270f578063248a9ca3146126e857806324e3fef71461260b57806327ac0c58146125e15780632f2ff15d146125af5780632f84c3911461251557806336568abe146124d057806342842e0e146124a65780634796ed04146123bb5780634c19386c1461239d578063537b1ec71461225657806358f67869146121f257806361d027b3146121c95780636352211e146121985780636eac61dd1461217a57806370a0823114612128578063715018a6146120be57806374de4ec414611ff957806375a0b6dd14611f4d5780637949227214611c1a57806387173a8e14611bfe57806387c1394314611bdd5780638aee812714611b435780638da5cb5b14611b0d57806391b7f5ed14611a9657806391d1485414611a4057806394a868a31461167257806395d89b411461157557806399fbab88146114de578063a035b1fe146114c1578063a0d8d78c14611382578063a217fddf14611366578063a22cb465146112c5578063a5d8777014611148578063b2bad5b2146110e8578063b35fb54214610ff4578063b88d4fde14610f67578063c87b56dd14610f0c578063cfdbf25414610eef578063d547741f14610eb8578063d797fe2214610db9578063da29b26514610d7a578063e16fd0ec14610d5d578063e5a6b10f14610d34578063e985e9c514610ce5578063eae86f0b14610cc7578063f00acbaa14610c8c578063f0f4426014610bf0578063f2fde38b14610bc3578063f36de22514610ba5578063f5b541a614610b6a578063f6a48fac14610b3c578063f7c618c114610b13578063f8c8765e14610510578063fbc14dda1461036c5763fc420e6b146102e157600080fd5b34610369576102ef36612b52565b6102f7613205565b801561035a57818352603c6020526040832090600582015461034b5781816040927f5e176ab3e891f654de569024045b7a17e243b1148cd50179f3c73c79edbb96e99454925582519182526020820152a280f35b63219ce9a360e01b8452600484fd5b634dfba02360e01b8352600483fd5b80fd5b5034610369576020366003190112610369576004356001600160401b03811161050c5761039d903690600401612b22565b906103a6613205565b603d5483603d558061047e575b508290815b8383106103e757847fdb840036dd546f2fc2b3a5a3807bc68f2b180b4a08b42c51429def8f7be480b68180a180f35b6127106103f5848685612e2c565b351161046f576020610408848685612e2c565b013511156104605761044761041e838584612e2c565b35602061042c858786612e2c565b01356040519161043b83612b91565b8252602082015261309d565b60016020610456848685612e2c565b01359201916103b8565b637616640160e01b8452600484fd5b636093dc5160e01b8552600485fd5b6001600160ff1b03811681036104f857603d845260011b7fece66cfdbd22e3f37d348a3d8e19074452862cd65fd4b9a11f0336d1ac6d1dc3017fece66cfdbd22e3f37d348a3d8e19074452862cd65fd4b9a11f0336d1ac6d1dc35b8181106104e657506103b3565b808560029255856001820155016104d9565b634e487b7160e01b84526011600452602484fd5b5080fd5b50346103695760803660031901126103695761052a612a3c565b610532612a52565b6044356001600160a01b03811690819003610b0e57606435906001600160a01b038216808303610b0e57600080516020613d46833981519152549360ff8560401c1615946001600160401b03811680159081610b06575b6001149081610afc575b159081610af3575b50610ae45767ffffffffffffffff198116600117600080516020613d468339815191525585610ab7575b5060409586516105d58882612bc2565b60158152742a3930b234b733ab30bab63a102837b9b4ba34b7b760591b60208201528751906106048983612bc2565b6002825261056560f41b602083015261061b613c77565b610623613c77565b8051906001600160401b038211610aa357819061064e600080516020613cc683398151915254612c33565b601f8111610a21575b50602090601f8311600114610996578c9261098b575b50508160011b916000199060031b1c191617600080516020613cc6833981519152555b8051906001600160401b0382116109775781906106bb600080516020613d6683398151915254612c33565b601f81116108fc575b50602090601f831160011461087d578b92610872575b50508160011b916000199060031b1c191617600080516020613d66833981519152555b610705613c77565b61070d613c77565b61071685613027565b61071e613c77565b6001600160a01b0316908115610863576001600160a01b0316918215610854578315610845571561083657906107959392916001600160601b0360a01b60015416176001556001600160601b0360a01b60025416176002556001600160601b0360a01b60035416176003556305f5e1008555613504565b5061079f33613386565b506107a933613448565b506107c882516107b881612b91565b612710815284602082015261309d565b600160ff1960075416176007556107dd575080f35b60207fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29168ff000000000000000019600080516020613d468339815191525416600080516020613d46833981519152555160018152a180f35b630702b3d960e41b8752600487fd5b63cfe2ea6360e01b8852600488fd5b636a27e5f160e01b8852600488fd5b63c2cf440960e01b8852600488fd5b0151905038806106da565b600080516020613d668339815191528c52818c209250601f1984168c5b8181106108e457509084600195949392106108cb575b505050811b01600080516020613d66833981519152556106fd565b015160001960f88460031b161c191690553880806108b0565b9293602060018192878601518155019501930161089a565b600080516020613d668339815191528c529091507ff4bad0a69248f59680a4f2b3000328cec71a413447c96781cfe5996daa8c456e601f840160051c8101916020851061096d575b90601f859493920160051c01905b81811061095f57506106c4565b8c8155849350600101610952565b9091508190610944565b634e487b7160e01b8a52604160045260248afd5b01519050388061066d565b600080516020613cc68339815191528d52600080516020613d868339815191529250601f1984168d5b818110610a0957509084600195949392106109f0575b505050811b01600080516020613cc683398151915255610690565b015160001960f88460031b161c191690553880806109d5565b929360206001819287860151815501950193016109bf565b909150600080516020613cc68339815191528c52601f830160051c600080516020613d86833981519152019060208410610a8d575b90601f8493920160051c600080516020613d8683398151915201905b818110610a7f5750610657565b8d8155849350600101610a72565b600080516020613d868339815191529150610a56565b634e487b7160e01b8b52604160045260248bfd5b68ffffffffffffffffff19166801000000000000000117600080516020613d4683398151915255386105c5565b63f92ee8a960e01b8852600488fd5b9050153861059b565b303b159150610593565b879150610589565b600080fd5b50346103695780600319360112610369576002546040516001600160a01b039091168152602090f35b503461036957602036600319011261036957610b66610b59612a3c565b610b61613277565b613448565b5080f35b503461036957806003193601126103695760206040517f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b9298152f35b50346103695780600319360112610369576020603d54604051908152f35b503461036957602036600319011261036957610bed610be0612a3c565b610be861398a565b613027565b80f35b503461036957602036600319011261036957610c0a612a3c565b610c1261398a565b6001600160a01b0381168015610c7d57600380546001600160a01b031981169092179055604080516001600160a01b0392831681529190921660208201527f4ab5be82436d353e61ca18726e984e561f5c1cc7c6d38b29d2553c790434705a91819081015b0390a180f35b63cfe2ea6360e01b8352600483fd5b503461036957806003193601126103695760206040517f04824fcb60e7cc526d70b264caa65b62ed44d9c8e5d230e8ff6b0c7373843b8a8152f35b50346103695780600319360112610369576020600854604051908152f35b503461036957604036600319011261036957610cff612a3c565b610d10610d0a612a52565b91612e9a565b9060018060a01b0316600052602052602060ff604060002054166040519015158152f35b50346103695780600319360112610369576001546040516001600160a01b039091168152602090f35b503461036957806003193601126103695760206040516127108152f35b50346103695760203660031901126103695760043590603d54821015610369576040610da583612bfe565b506001815491015482519182526020820152f35b5034610369576020366003190112610369576004358015610ea9576006548111610e9a576001546040516323b872dd60e01b815233600482015230602482015260448101839052906020908290606490829087906001600160a01b03165af18015610e8f57610e62575b50610e308160065461301a565b6006556040519081527f1ddc8f26f8c3c076f9978db18d22e7b427b1a630289eda0ff2e784501db7225360203392a280f35b610e839060203d602011610e88575b610e7b8183612bc2565b810190612e49565b610e23565b503d610e71565b6040513d85823e3d90fd5b63e480bdff60e01b8252600482fd5b631f2a200560e01b8252600482fd5b503461036957604036600319011261036957610b66600435610ed8612a52565b90610eea610ee582612dfb565b61333c565b613635565b50346103695780600319360112610369576020604051611f408152f35b503461036957602036600319011261036957610f29600435613112565b5060209080604051610f3b8482612bc2565b525060405190610f4b8183612bc2565b60008252610f636040519282849384528301906129fb565b0390f35b503461036957608036600319011261036957610f81612a3c565b610f89612a52565b90606435906001600160401b038211610ff05736602383011215610ff05781600401359284610fb785612be3565b93610fc56040519586612bc2565b858552366024878301011161050c5785610bed96602460209301838801378501015260443591612ed3565b8380fd5b50346103695760403660031901126103695761100e612a3c565b60243561101961398a565b6001546001600160a01b039283169216821480156110d4575b6110c55780156110b65760405163a9059cbb60e01b81523360048201526024810191909152906020908290604490829086905af19081156110ab57829161108c575b501561107d5780f35b63360e42e160e01b8152600490fd5b6110a5915060203d602011610e8857610e7b8183612bc2565b38611074565b6040513d84823e3d90fd5b631f2a200560e01b8352600483fd5b63e3542bf760e01b8352600483fd5b506002546001600160a01b03168214611032565b5034610369576110f736612b52565b6110ff613205565b818352603c60205260408320600581015461034b57817f4543fdb253b6e350e8c47f75076648def2738cf8ad1c799f5bc933a07dfb2a0d9260096020930155604051908152a280f35b50346103695761115736612ad2565b9291611161613205565b83810361128057801561124c57611f40811161121057845b818110611184578580f35b61118f818386612e1c565b358652603c602052604086206005810154611201579060019160096111b5838988612e1c565b359101556111c4818487612e1c565b357f4543fdb253b6e350e8c47f75076648def2738cf8ad1c799f5bc933a07dfb2a0d60206111f3848a89612e1c565b35604051908152a201611179565b63219ce9a360e01b8752600487fd5b60405162461bcd60e51b815260206004820152601460248201527342617463682073697a6520746f6f206c6172676560601b6044820152606490fd5b60405162461bcd60e51b815260206004820152600c60248201526b456d7074792061727261797360a01b6044820152606490fd5b60405162461bcd60e51b815260206004820152601860248201527f4172726179206c656e67746873206d757374206d6174636800000000000000006044820152606490fd5b5034610369576040366003190112610369576112df612a3c565b60243590811515809203611362576001600160a01b031690811561134e5761130633612e9a565b82600052602052604060002060ff1981541660ff83161790556040519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a380f35b630b61174360e31b83526004829052602483fd5b8280fd5b5034610369578060031936011261036957602090604051908152f35b50346103695760203660031901126103695760043561139f61398a565b8015610ea9576001546040516370a0823160e01b81523060048201526001600160a01b0390911690602081602481855afa9081156114b6578491611484575b5082116114755760405163a9059cbb60e01b815233600482015260248101839052906020908290604490829087905af18015610e8f57611458575b5061142681600654612e3c565b6006556040519081527f2c2d88bb2c04a245a8df31f649252cce1de7bf7ac17d3555f3b7530f968f8d0660203392a280f35b6114709060203d602011610e8857610e7b8183612bc2565b611419565b631e9acf1760e31b8352600483fd5b90506020813d6020116114ae575b8161149f60209383612bc2565b81010312610ff05751386113de565b3d9150611492565b6040513d86823e3d90fd5b503461036957806003193601126103695760209054604051908152f35b5034610369576020366003190112610369576040610140916004358152603c60205220805490600181015490600281015460038201546004830154600584015490600685015492600786015494600960018060a01b0360088901541697015497604051998a5260208a015260408901526060880152608087015260a086015260c085015260e0840152610100830152610120820152f35b50346103695780600319360112610369576040519080600080516020613d6683398151915254906115a582612c33565b808552916001811690811561164b57506001146115e1575b610f63846115cd81860382612bc2565b6040519182916020835260208301906129fb565b600080516020613d6683398151915281527ff4bad0a69248f59680a4f2b3000328cec71a413447c96781cfe5996daa8c456e939250905b808210611631575090915081016020016115cd826115bd565b919260018160209254838588010152019101909291611618565b60ff191660208087019190915292151560051b850190920192506115cd91508390506115bd565b50346103695761168136612b52565b61168c929192613205565b828252603c602052604082209260098401548015908115611a35575b50611a26576005840154611a17578115611a095782546050810281158282046050148117156119f5576096830292830460961417156119e1576064900483109081156119d4575b506119c5576116fd81613112565b92600260018060a01b036008870154169501549061171a83613112565b6001600160a01b0316331415806119a0575b80611999575b61198a57828152603c602052600560408220015461197b575081600052603c602052604060002092811561196a5760028401805483116119595761177886838587613a26565b8698939198959295986000958554808610611915575b507f2f61af559bf23be05bd7bb2fe5574529caa9a0176cc730cc3dc0d1bd40ec937560206117be8b60055461301a565b80600555604051908152a180548980820361190557505042600587015560018601859055600081556001600160a01b036117f78b61317d565b16156118f0575b5496600786015493600687015496600860018060a01b0391015416986040519a8b5260208b015260408a01526060890152608088015260a087015260c086015260e08501526101008401526101208301526101408201527f1291b17e4c611ac722f03763ded81e523d2aa81f5ca80b235aba2fcbe7a0d31761016060018060a01b03861692a38061188b57005b60405163a9059cbb60e01b81526001600160a01b03929092166004830152602482015290602090829060449082906000905af180156118e4576118ca57005b6118e29060203d602011610e8857610e7b8183612bc2565b005b6040513d6000823e3d90fd5b89637e27328960e01b60005260045260246000fd5b61190e9161301a565b81556117fe565b61192e919b50856119289198939861301a565b89612b68565b6305f5e10091500494611952866007870161194a828254612e3c565b90558961301a565b993861178e565b631e9acf1760e31b60005260046000fd5b631f2a200560e01b60005260046000fd5b63219ce9a360e01b8152600490fd5b636d8a29e760e11b8152600490fd5b5080611732565b506119aa83613112565b50336001600160a01b036119bd85613143565b16141561172c565b630df22a0f60e21b8352600483fd5b60649150048211386116ef565b634e487b7160e01b85526011600452602485fd5b634e487b7160e01b86526011600452602486fd5b62bfc92160e01b8352600483fd5b63219ce9a360e01b8352600483fd5b6309f7a15560e11b8352600483fd5b9050421115386116a8565b50346103695760403660031901126103695760ff6040602092611a61612a52565b6004358252600080516020613d0683398151915285528282206001600160a01b03909116825284522054604051911615158152f35b503461036957602036600319011261036957600435611ab36132ca565b8015611afe5760807fc6d3da45896ce1bca9d198309a2dbeea3c73a991748f8d88d796ffa06029de93918354908085556040519182526020820152836040820152426060820152a180f35b634dfba02360e01b8252600482fd5b5034610369578060031936011261036957600080516020613ce6833981519152546040516001600160a01b039091168152602090f35b503461036957602036600319011261036957611b5d612a3c565b611b65613205565b6001600160a01b0381168015611bce57600280546001600160a01b031981169092179055604080516001600160a01b0392831681529190921660208201527f906ff2422a6ffa134f2d7ccaffd446bc0c583a5cb6615749b4b2836942a5fea89181908101610c77565b636a27e5f160e01b8352600483fd5b50346103695780600319360112610369575060206305f5e100604051908152f35b5034610369578060031936011261036957602060405160968152f35b503461036957606036600319011261036957600435611c37612a52565b90604435918115611f3e576001600160a01b038116611f38575033905b6001546040516323b872dd60e01b815233600482015230602482015260448101839052906020908290606490829089906001600160a01b03165af18015611f2d57611f10575b506004549260001984146119e15760018401600455845460018060a01b03600154166040519161014083018381106001600160401b03821117611efc57918491600993604052845283888a60208301818152604084018a815260608501908b82526080860192428452604060a088019580875260c089019781895261012060e08b019a838c5261010081019c8d52019b8c528152603c602052209a518b555160018b01555160028a015551600389015551600488015551600587015551600686015551600785015560018060a01b03905116600884019060018060a01b03166001600160601b0360a01b825416179055519101557f2f61af559bf23be05bd7bb2fe5574529caa9a0176cc730cc3dc0d1bd40ec93756020611dbd84600554612e3c565b80600555604051908152a16001600160a01b038316928315611ee857611de2856139c0565b6001600160a01b0381168015159287918791611e029086611ec957612e61565b80546001019055828a52600080516020613d2683398151915260205260408a2080546001600160a01b031916831790557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8a80a450611eb55760a08493927ff5097c6b4689824558e56b486a27d0a598420ba3453bb2988e15785271d06725926020975491600180851b0360015416906040519384528984015242604084015260608301526080820152a3604051908152f35b6339e3563760e11b85526004859052602485fd5b611ed2856139e8565b611edb86612e61565b8054600019019055612e61565b633250574960e11b86526004869052602486fd5b634e487b7160e01b89526041600452602489fd5b611f289060203d602011610e8857610e7b8183612bc2565b611c9a565b6040513d87823e3d90fd5b90611c54565b631f2a200560e01b8452600484fd5b503461036957611f5c36612b52565b60ff6007939293541615611fea57611f928383948452603c60205260018060a01b036008604086200154169284549033926136d5565b80611f9b575050f35b60405163a9059cbb60e01b815233600482015260248101919091529160209183916044918391905af180156110ab57611fd2575080f35b610b669060203d602011610e8857610e7b8183612bc2565b6333962fd760e01b8252600482fd5b5034610369576020366003190112610369576004358015610ea9576002546040516323b872dd60e01b81523360048201523060248201526044810183905291906020908390606490829087906001600160a01b03165af1908115610e8f577fc04c302bacaef8c9bec8841c7f0dffba5a121e12e14b6a52f9fc9940ecf0d7aa926040926120a1575b5061208f6008549182612e3c565b8060085582519182526020820152a180f35b6120b99060203d602011610e8857610e7b8183612bc2565b612081565b50346103695780600319360112610369576120d761398a565b600080516020613ce683398151915280546001600160a01b0319811690915581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b503461036957602036600319011261036957612142612a3c565b906001600160a01b0382161561216657602061215d83612e61565b54604051908152f35b6322718ad960e21b81526004819052602490fd5b50346103695780600319360112610369576020600954604051908152f35b50346103695760203660031901126103695760206121b7600435613112565b6040516001600160a01b039091168152f35b50346103695780600319360112610369576003546040516001600160a01b039091168152602090f35b50346103695760203660031901126103695760043580151580910361050c5760207f29ba88224264632c83574215c72146e3239d91512d22b3b47194eb28bc26aa359161223d61398a565b60ff196007541660ff821617600755604051908152a180f35b50346103695761226536612ad2565b9060ff60079594939554161561238e5781850361128057841561124c5782358452603c60205260408420600801546001600160a01b0316928492839291905b8784106122b8578680878780611f9b575050f35b909192936122c7858985612e1c565b358752603c60205260408720600801546001600160a01b0316869003612323576123196001916123136122fb888c88612e1c565b3561230789878a612e1c565b359033918c54916136d5565b90612e3c565b94019291906122a4565b60405162461bcd60e51b815260206004820152603a60248201527f416c6c20706f736974696f6e73206d75737420757365207468652073616d652060448201527f746f6b656e20666f722062617463682070726f63657373696e670000000000006064820152608490fd5b6333962fd760e01b8452600484fd5b50346103695780600319360112610369576020600654604051908152f35b5034610369576020366003190112610369576004356001600160401b03811161050c576123ec903690600401612b22565b906123f56132ca565b811561247357611f40821161121057825490835b838110612414578480f35b807fc6d3da45896ce1bca9d198309a2dbeea3c73a991748f8d88d796ffa06029de9360806124456001948887612e2c565b356020612453858a89612e2c565b01356040519188835260208301528960408301526060820152a101612409565b60405162461bcd60e51b815260206004820152600b60248201526a456d70747920617272617960a81b6044820152606490fd5b503461036957610bed6124b836612a68565b90604051926124c8602085612bc2565b858452612ed3565b5034610369576040366003190112610369576124ea612a52565b336001600160a01b0382160361250657610b6690600435613635565b63334bd91960e11b8252600482fd5b50346103695760203660031901126103695761252f612a3c565b612537613205565b6001600160a01b03811680156125a057600180546001600160a01b031981169092179055604080516001600160a01b0392831681529190921660208201527fce76357c57fa1f65ea8fb41c18f6a9bac76156984fee9e0f25a24b66977bb59d9181908101610c77565b63c2cf440960e01b8352600483fd5b503461036957604036600319011261036957610b666004356125cf612a52565b906125dc610ee582612dfb565b61359e565b503461036957602036600319011261036957610b666125fe612a3c565b612606613277565b613386565b50346103695761261a36612ad2565b9291612624613205565b83810361128057801561124c57611f40811161121057845b818110612647578580f35b612652818685612e1c565b35156126d957612663818386612e1c565b358652603c60205260408620600581015461120157805460019291612689838988612e1c565b3590557f5e176ab3e891f654de569024045b7a17e243b1148cd50179f3c73c79edbb96e960406126ba84878a612e1c565b35926126c7858b8a612e1c565b3582519182526020820152a20161263c565b634dfba02360e01b8652600486fd5b5034610369576020366003190112610369576020612707600435612dfb565b604051908152f35b503461036957610bed61272136612a68565b91612c6d565b50346103695780600319360112610369576020600554604051908152f35b5034610369578060031936011261036957602060ff600754166040519015158152f35b50346103695780600319360112610369576020604051620f42408152f35b5034610369576040366003190112610369576127a0612a3c565b6024356127ac81613112565b3315158061286d575b8061284f575b61283c5781906001600160a01b0384811691167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258680a482527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab00793046020526040822080546001600160a01b0319166001600160a01b0390921691909117905580f35b63a9fbf51f60e01b845233600452602484fd5b5061285981612e9a565b338552602052604084205460ff16156127bb565b506001600160a01b0381163314156127b5565b50346103695760203660031901126103695760206121b76004356128a381613112565b50613143565b50346103695780600319360112610369576040519080600080516020613cc683398151915254906128d982612c33565b808552916001811690811561164b575060011461290057610f63846115cd81860382612bc2565b600080516020613cc68339815191528152600080516020613d86833981519152939250905b80821061293e575090915081016020016115cd826115bd565b919260018160209254838588010152019101909291612925565b5034610369578060031936011261036957602060405160508152f35b90503461050c57602036600319011261050c5760043563ffffffff60e01b81168091036113625760209250637965db0b60e01b81149081156129b8575b5015158152f35b6380ac58cd60e01b8114915081156129ea575b81156129d9575b50386129b1565b6301ffc9a760e01b149050386129d2565b635b5e139f60e01b811491506129cb565b919082519283825260005b848110612a27575050826000602080949584010152601f8019910116010190565b80602080928401015182828601015201612a06565b600435906001600160a01b0382168203610b0e57565b602435906001600160a01b0382168203610b0e57565b6060906003190112610b0e576004356001600160a01b0381168103610b0e57906024356001600160a01b0381168103610b0e579060443590565b9181601f84011215610b0e578235916001600160401b038311610b0e576020808501948460051b010111610b0e57565b6040600319820112610b0e576004356001600160401b038111610b0e5781612afc91600401612aa2565b92909291602435906001600160401b038211610b0e57612b1e91600401612aa2565b9091565b9181601f84011215610b0e578235916001600160401b038311610b0e576020808501948460061b010111610b0e57565b6040906003190112610b0e576004359060243590565b81810292918115918404141715612b7b57565b634e487b7160e01b600052601160045260246000fd5b604081019081106001600160401b03821117612bac57604052565b634e487b7160e01b600052604160045260246000fd5b90601f801991011681019081106001600160401b03821117612bac57604052565b6001600160401b038111612bac57601f01601f191660200190565b603d54811015612c1d57603d60005260206000209060011b0190600090565b634e487b7160e01b600052603260045260246000fd5b90600182811c92168015612c63575b6020831014612c4d57565b634e487b7160e01b600052602260045260246000fd5b91607f1691612c42565b909291906001600160a01b0384168015612de557600094612c8d846139c0565b9533151580612d4c575b509184917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef612cd897989460018060a01b03861698899384612d3a57612e61565b80546001019055848152600080516020613d268339815191526020526040812080546001600160a01b0319168517905580a4506001600160a01b0316808303612d2057505050565b6364283d7b60e01b60005260045260245260445260646000fd5b612d43876139e8565b611edb88612e61565b80612d95575b15612d5d5738612c97565b84906001600160a01b038816612d7f57602491637e27328960e01b8252600452fd5b60449163177e802f60e01b825233600452602452fd5b506001600160a01b03871633148015612dc8575b80612d525750336001600160a01b03612dc187613143565b1614612d52565b50612dd287612e9a565b338252602052604081205460ff16612da9565b633250574960e11b600052600060045260246000fd5b600052600080516020613d0683398151915260205260016040600020015490565b9190811015612c1d5760051b0190565b9190811015612c1d5760061b0190565b91908201809211612b7b57565b90816020910312610b0e57518015158103610b0e5790565b6001600160a01b031660009081527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab00793036020526040902090565b6001600160a01b031660009081527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab00793056020526040902090565b9291612ee0818386612c6d565b813b612eed575b50505050565b604051630a85bd0160e11b81523360048201526001600160a01b0394851660248201526044810191909152608060648201529216919060209082908190612f389060848301906129fb565b03816000865af18091600091612fd7575b5090612fa257503d15612f9b573d612f6081612be3565b90612f6e6040519283612bc2565b81523d6000602083013e5b80519081612f965782633250574960e11b60005260045260246000fd5b602001fd5b6060612f79565b6001600160e01b03191663757a42ff60e11b01612fc3575038808080612ee7565b633250574960e11b60005260045260246000fd5b6020813d602011613012575b81612ff060209383612bc2565b8101031261050c5751906001600160e01b031982168203610369575038612f49565b3d9150612fe3565b91908203918211612b7b57565b6001600160a01b0316801561308757600080516020613ce683398151915280546001600160a01b0319811683179091556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b631e4fbdf760e01b600052600060045260246000fd5b603d5468010000000000000000811015612bac5760018101603d556000603d548210156130fe57603d905260011b7fece66cfdbd22e3f37d348a3d8e19074452862cd65fd4b9a11f0336d1ac6d1dc301906020816001925184550151910155565b634e487b7160e01b81526032600452602490fd5b61311b816139c0565b906001600160a01b0382161561312f575090565b637e27328960e01b60005260045260246000fd5b60009081527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab007930460205260409020546001600160a01b031690565b613186816139c0565b9060006001600160a01b038316806131e7575b828252600080516020613d268339815191526020526040822080546001600160a01b03191690557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a490565b6131f0836139e8565b6131f984612e61565b82198154019055613199565b3360009081527f448256db8f8fb95ee3eaaf89c1051414494e85cebb6057fcf996cc3d0ccfb456602052604090205460ff161561323e57565b63e2517d3f60e01b600052336004527f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b92960245260446000fd5b3360009081527fb7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d602052604090205460ff16156132b057565b63e2517d3f60e01b60005233600452600060245260446000fd5b3360009081527f9cfad5238ce3e0b54cbca0820bf2b02d66d496527d1fa42cb60bdcdd96bd88ab602052604090205460ff161561330357565b63e2517d3f60e01b600052336004527f04824fcb60e7cc526d70b264caa65b62ed44d9c8e5d230e8ff6b0c7373843b8a60245260446000fd5b6000818152600080516020613d068339815191526020908152604080832033845290915290205460ff161561336e5750565b63e2517d3f60e01b6000523360045260245260446000fd5b6001600160a01b03811660009081527f448256db8f8fb95ee3eaaf89c1051414494e85cebb6057fcf996cc3d0ccfb456602052604090205460ff16613442576001600160a01b031660008181527f448256db8f8fb95ee3eaaf89c1051414494e85cebb6057fcf996cc3d0ccfb45660205260408120805460ff191660011790553391907f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b92990600080516020613ca68339815191529080a4600190565b50600090565b6001600160a01b03811660009081527f9cfad5238ce3e0b54cbca0820bf2b02d66d496527d1fa42cb60bdcdd96bd88ab602052604090205460ff16613442576001600160a01b031660008181527f9cfad5238ce3e0b54cbca0820bf2b02d66d496527d1fa42cb60bdcdd96bd88ab60205260408120805460ff191660011790553391907f04824fcb60e7cc526d70b264caa65b62ed44d9c8e5d230e8ff6b0c7373843b8a90600080516020613ca68339815191529080a4600190565b6001600160a01b03811660009081527fb7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d602052604090205460ff16613442576001600160a01b031660008181527fb7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d60205260408120805460ff19166001179055339190600080516020613ca68339815191528180a4600190565b6000818152600080516020613d06833981519152602090815260408083206001600160a01b038616845290915290205460ff1661362e576000818152600080516020613d06833981519152602090815260408083206001600160a01b0395909516808452949091528120805460ff1916600117905533929190600080516020613ca68339815191529080a4600190565b5050600090565b6000818152600080516020613d06833981519152602090815260408083206001600160a01b038616845290915290205460ff161561362e576000818152600080516020613d06833981519152602090815260408083206001600160a01b0395909516808452949091528120805460ff19169055339291907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080a4600190565b91926136e083613112565b6001600160a01b031633141580613965575b8061395d575b61394c5782600052603c60205260056040600020015461393b5782600052603c602052600960406000200154151580613921575b6139105782600052603c602052604060002093821561196a5760028501805484116119595761375d83838688613a26565b87999391999592959960009585548086106138cc575b507f2f61af559bf23be05bd7bb2fe5574529caa9a0176cc730cc3dc0d1bd40ec937560206137a38c60055461301a565b80600555604051908152a189815480821460001461388e57505042600587015560018601859055600081556001600160a01b036137df8c61317d565b16156138795791610160979593917f1291b17e4c611ac722f03763ded81e523d2aa81f5ca80b235aba2fcbe7a0d317999795935b5460078601546006870154600890970154604080519e8f5260208f0193909352918d019490945260608c019790975260808b015260a08a015260c089015260e08801526101008701526101208601526001600160a01b039081166101408601521692a390565b8a637e27328960e01b60005260045260246000fd5b916138c56101609a989694927f1291b17e4c611ac722f03763ded81e523d2aa81f5ca80b235aba2fcbe7a0d3179c9a98969461301a565b8155613813565b6138e5919c50856138df9198939861301a565b8a612b68565b6305f5e100915004946139098660078701613901828254612e3c565b90558a61301a565b9a38613773565b6315ff94d360e11b60005260046000fd5b5082600052603c602052600960406000200154421161372c565b63219ce9a360e01b60005260046000fd5b636d8a29e760e11b60005260046000fd5b5060016136f8565b5061396f83613112565b50336001600160a01b0361398285613143565b1614156136f2565b600080516020613ce6833981519152546001600160a01b031633036139ab57565b63118cdaa760e01b6000523360045260246000fd5b6000908152600080516020613d2683398151915260205260409020546001600160a01b031690565b6000527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab007930460205260406000206001600160601b0360a01b8154169055565b919091600052603c60205260406000209182549182811115613c6457613a5592613a4f9161301a565b90612b68565b6305f5e1009004928315613c5657613a7160048301544261301a565b93603d5460009560005b828110613c2157505050612710613a928683612b68565b04936006613aa0868461301a565b9401613aad838254612e3c565b9055846009549181613bb8575b505083151580613ba4575b613b0f575b60407f903baec967bd87828705b3a5cfaffa06bd05cf4d6b29bbc0c10318dfa1918de291613afa84600954612e3c565b8060095582519182526020820152a193929190565b60025460035460405163a9059cbb60e01b81526001600160a01b03918216600482015260248101879052929160209184916044918391600091165af19081156118e4577f903baec967bd87828705b3a5cfaffa06bd05cf4d6b29bbc0c10318dfa1918de292604092613b85575b50915050613aca565b613b9d9060203d602011610e8857610e7b8183612bc2565b5038613b7c565b506003546001600160a01b03161515613ac5565b60025460405163a9059cbb60e01b81526001600160a01b039283166004820152602481019390935260209183916044918391600091165af180156118e457613c02575b8590613aba565b613c1a9060203d602011610e8857610e7b8183612bc2565b5038613bfb565b6001613c2c82612bfe565b500154821015613c3f575b600101613a7b565b96506001613c4c88612bfe565b5054979050613c37565b600093508392508291508190565b5050505050600090600090600090600090565b60ff600080516020613d468339815191525460401c1615613c9457565b631afcd79f60e31b60005260046000fdfe2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab00793009016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930002dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680080bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab0079302f0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0080bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab007930137c58c799b6609234b945e882912ee9ad34948a1dfaa20a97485e1a7752bbf81a26469706673582212201ada232246124c468b6f5b0a190b6dfff21c3c6a67394a7ffda833159452d0c064736f6c634300081c0033",
|
1926
|
-
"deployedBytecode": "0x608080604052600436101561001357600080fd5b600090813560e01c90816301ffc9a7146129745750806303e0ac861461295857806306fdde03146128a9578063081812fc14612880578063095ea7b3146127865780630d8317e1146127685780630ead7712146127455780631a39d8ef1461272757806323b872dd1461270f578063248a9ca3146126e857806324e3fef71461260b57806327ac0c58146125e15780632f2ff15d146125af5780632f84c3911461251557806336568abe146124d057806342842e0e146124a65780634796ed04146123bb5780634c19386c1461239d578063537b1ec71461225657806358f67869146121f257806361d027b3146121c95780636352211e146121985780636eac61dd1461217a57806370a0823114612128578063715018a6146120be57806374de4ec414611ff957806375a0b6dd14611f4d5780637949227214611c1a57806387173a8e14611bfe57806387c1394314611bdd5780638aee812714611b435780638da5cb5b14611b0d57806391b7f5ed14611a9657806391d1485414611a4057806394a868a31461167257806395d89b411461157557806399fbab88146114de578063a035b1fe146114c1578063a0d8d78c14611382578063a217fddf14611366578063a22cb465146112c5578063a5d8777014611148578063b2bad5b2146110e8578063b35fb54214610ff4578063b88d4fde14610f67578063c87b56dd14610f0c578063cfdbf25414610eef578063d547741f14610eb8578063d797fe2214610db9578063da29b26514610d7a578063e16fd0ec14610d5d578063e5a6b10f14610d34578063e985e9c514610ce5578063eae86f0b14610cc7578063f00acbaa14610c8c578063f0f4426014610bf0578063f2fde38b14610bc3578063f36de22514610ba5578063f5b541a614610b6a578063f6a48fac14610b3c578063f7c618c114610b13578063f8c8765e14610510578063fbc14dda1461036c5763fc420e6b146102e157600080fd5b34610369576102ef36612b52565b6102f7613205565b801561035a57818352603c6020526040832090600582015461034b5781816040927f5e176ab3e891f654de569024045b7a17e243b1148cd50179f3c73c79edbb96e99454925582519182526020820152a280f35b63219ce9a360e01b8452600484fd5b634dfba02360e01b8352600483fd5b80fd5b5034610369576020366003190112610369576004356001600160401b03811161050c5761039d903690600401612b22565b906103a6613205565b603d5483603d558061047e575b508290815b8383106103e757847fdb840036dd546f2fc2b3a5a3807bc68f2b180b4a08b42c51429def8f7be480b68180a180f35b6127106103f5848685612e2c565b351161046f576020610408848685612e2c565b013511156104605761044761041e838584612e2c565b35602061042c858786612e2c565b01356040519161043b83612b91565b8252602082015261309d565b60016020610456848685612e2c565b01359201916103b8565b637616640160e01b8452600484fd5b636093dc5160e01b8552600485fd5b6001600160ff1b03811681036104f857603d845260011b7fece66cfdbd22e3f37d348a3d8e19074452862cd65fd4b9a11f0336d1ac6d1dc3017fece66cfdbd22e3f37d348a3d8e19074452862cd65fd4b9a11f0336d1ac6d1dc35b8181106104e657506103b3565b808560029255856001820155016104d9565b634e487b7160e01b84526011600452602484fd5b5080fd5b50346103695760803660031901126103695761052a612a3c565b610532612a52565b6044356001600160a01b03811690819003610b0e57606435906001600160a01b038216808303610b0e57600080516020613d46833981519152549360ff8560401c1615946001600160401b03811680159081610b06575b6001149081610afc575b159081610af3575b50610ae45767ffffffffffffffff198116600117600080516020613d468339815191525585610ab7575b5060409586516105d58882612bc2565b60158152742a3930b234b733ab30bab63a102837b9b4ba34b7b760591b60208201528751906106048983612bc2565b6002825261056560f41b602083015261061b613c77565b610623613c77565b8051906001600160401b038211610aa357819061064e600080516020613cc683398151915254612c33565b601f8111610a21575b50602090601f8311600114610996578c9261098b575b50508160011b916000199060031b1c191617600080516020613cc6833981519152555b8051906001600160401b0382116109775781906106bb600080516020613d6683398151915254612c33565b601f81116108fc575b50602090601f831160011461087d578b92610872575b50508160011b916000199060031b1c191617600080516020613d66833981519152555b610705613c77565b61070d613c77565b61071685613027565b61071e613c77565b6001600160a01b0316908115610863576001600160a01b0316918215610854578315610845571561083657906107959392916001600160601b0360a01b60015416176001556001600160601b0360a01b60025416176002556001600160601b0360a01b60035416176003556305f5e1008555613504565b5061079f33613386565b506107a933613448565b506107c882516107b881612b91565b612710815284602082015261309d565b600160ff1960075416176007556107dd575080f35b60207fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29168ff000000000000000019600080516020613d468339815191525416600080516020613d46833981519152555160018152a180f35b630702b3d960e41b8752600487fd5b63cfe2ea6360e01b8852600488fd5b636a27e5f160e01b8852600488fd5b63c2cf440960e01b8852600488fd5b0151905038806106da565b600080516020613d668339815191528c52818c209250601f1984168c5b8181106108e457509084600195949392106108cb575b505050811b01600080516020613d66833981519152556106fd565b015160001960f88460031b161c191690553880806108b0565b9293602060018192878601518155019501930161089a565b600080516020613d668339815191528c529091507ff4bad0a69248f59680a4f2b3000328cec71a413447c96781cfe5996daa8c456e601f840160051c8101916020851061096d575b90601f859493920160051c01905b81811061095f57506106c4565b8c8155849350600101610952565b9091508190610944565b634e487b7160e01b8a52604160045260248afd5b01519050388061066d565b600080516020613cc68339815191528d52600080516020613d868339815191529250601f1984168d5b818110610a0957509084600195949392106109f0575b505050811b01600080516020613cc683398151915255610690565b015160001960f88460031b161c191690553880806109d5565b929360206001819287860151815501950193016109bf565b909150600080516020613cc68339815191528c52601f830160051c600080516020613d86833981519152019060208410610a8d575b90601f8493920160051c600080516020613d8683398151915201905b818110610a7f5750610657565b8d8155849350600101610a72565b600080516020613d868339815191529150610a56565b634e487b7160e01b8b52604160045260248bfd5b68ffffffffffffffffff19166801000000000000000117600080516020613d4683398151915255386105c5565b63f92ee8a960e01b8852600488fd5b9050153861059b565b303b159150610593565b879150610589565b600080fd5b50346103695780600319360112610369576002546040516001600160a01b039091168152602090f35b503461036957602036600319011261036957610b66610b59612a3c565b610b61613277565b613448565b5080f35b503461036957806003193601126103695760206040517f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b9298152f35b50346103695780600319360112610369576020603d54604051908152f35b503461036957602036600319011261036957610bed610be0612a3c565b610be861398a565b613027565b80f35b503461036957602036600319011261036957610c0a612a3c565b610c1261398a565b6001600160a01b0381168015610c7d57600380546001600160a01b031981169092179055604080516001600160a01b0392831681529190921660208201527f4ab5be82436d353e61ca18726e984e561f5c1cc7c6d38b29d2553c790434705a91819081015b0390a180f35b63cfe2ea6360e01b8352600483fd5b503461036957806003193601126103695760206040517f04824fcb60e7cc526d70b264caa65b62ed44d9c8e5d230e8ff6b0c7373843b8a8152f35b50346103695780600319360112610369576020600854604051908152f35b503461036957604036600319011261036957610cff612a3c565b610d10610d0a612a52565b91612e9a565b9060018060a01b0316600052602052602060ff604060002054166040519015158152f35b50346103695780600319360112610369576001546040516001600160a01b039091168152602090f35b503461036957806003193601126103695760206040516127108152f35b50346103695760203660031901126103695760043590603d54821015610369576040610da583612bfe565b506001815491015482519182526020820152f35b5034610369576020366003190112610369576004358015610ea9576006548111610e9a576001546040516323b872dd60e01b815233600482015230602482015260448101839052906020908290606490829087906001600160a01b03165af18015610e8f57610e62575b50610e308160065461301a565b6006556040519081527f1ddc8f26f8c3c076f9978db18d22e7b427b1a630289eda0ff2e784501db7225360203392a280f35b610e839060203d602011610e88575b610e7b8183612bc2565b810190612e49565b610e23565b503d610e71565b6040513d85823e3d90fd5b63e480bdff60e01b8252600482fd5b631f2a200560e01b8252600482fd5b503461036957604036600319011261036957610b66600435610ed8612a52565b90610eea610ee582612dfb565b61333c565b613635565b50346103695780600319360112610369576020604051611f408152f35b503461036957602036600319011261036957610f29600435613112565b5060209080604051610f3b8482612bc2565b525060405190610f4b8183612bc2565b60008252610f636040519282849384528301906129fb565b0390f35b503461036957608036600319011261036957610f81612a3c565b610f89612a52565b90606435906001600160401b038211610ff05736602383011215610ff05781600401359284610fb785612be3565b93610fc56040519586612bc2565b858552366024878301011161050c5785610bed96602460209301838801378501015260443591612ed3565b8380fd5b50346103695760403660031901126103695761100e612a3c565b60243561101961398a565b6001546001600160a01b039283169216821480156110d4575b6110c55780156110b65760405163a9059cbb60e01b81523360048201526024810191909152906020908290604490829086905af19081156110ab57829161108c575b501561107d5780f35b63360e42e160e01b8152600490fd5b6110a5915060203d602011610e8857610e7b8183612bc2565b38611074565b6040513d84823e3d90fd5b631f2a200560e01b8352600483fd5b63e3542bf760e01b8352600483fd5b506002546001600160a01b03168214611032565b5034610369576110f736612b52565b6110ff613205565b818352603c60205260408320600581015461034b57817f4543fdb253b6e350e8c47f75076648def2738cf8ad1c799f5bc933a07dfb2a0d9260096020930155604051908152a280f35b50346103695761115736612ad2565b9291611161613205565b83810361128057801561124c57611f40811161121057845b818110611184578580f35b61118f818386612e1c565b358652603c602052604086206005810154611201579060019160096111b5838988612e1c565b359101556111c4818487612e1c565b357f4543fdb253b6e350e8c47f75076648def2738cf8ad1c799f5bc933a07dfb2a0d60206111f3848a89612e1c565b35604051908152a201611179565b63219ce9a360e01b8752600487fd5b60405162461bcd60e51b815260206004820152601460248201527342617463682073697a6520746f6f206c6172676560601b6044820152606490fd5b60405162461bcd60e51b815260206004820152600c60248201526b456d7074792061727261797360a01b6044820152606490fd5b60405162461bcd60e51b815260206004820152601860248201527f4172726179206c656e67746873206d757374206d6174636800000000000000006044820152606490fd5b5034610369576040366003190112610369576112df612a3c565b60243590811515809203611362576001600160a01b031690811561134e5761130633612e9a565b82600052602052604060002060ff1981541660ff83161790556040519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a380f35b630b61174360e31b83526004829052602483fd5b8280fd5b5034610369578060031936011261036957602090604051908152f35b50346103695760203660031901126103695760043561139f61398a565b8015610ea9576001546040516370a0823160e01b81523060048201526001600160a01b0390911690602081602481855afa9081156114b6578491611484575b5082116114755760405163a9059cbb60e01b815233600482015260248101839052906020908290604490829087905af18015610e8f57611458575b5061142681600654612e3c565b6006556040519081527f2c2d88bb2c04a245a8df31f649252cce1de7bf7ac17d3555f3b7530f968f8d0660203392a280f35b6114709060203d602011610e8857610e7b8183612bc2565b611419565b631e9acf1760e31b8352600483fd5b90506020813d6020116114ae575b8161149f60209383612bc2565b81010312610ff05751386113de565b3d9150611492565b6040513d86823e3d90fd5b503461036957806003193601126103695760209054604051908152f35b5034610369576020366003190112610369576040610140916004358152603c60205220805490600181015490600281015460038201546004830154600584015490600685015492600786015494600960018060a01b0360088901541697015497604051998a5260208a015260408901526060880152608087015260a086015260c085015260e0840152610100830152610120820152f35b50346103695780600319360112610369576040519080600080516020613d6683398151915254906115a582612c33565b808552916001811690811561164b57506001146115e1575b610f63846115cd81860382612bc2565b6040519182916020835260208301906129fb565b600080516020613d6683398151915281527ff4bad0a69248f59680a4f2b3000328cec71a413447c96781cfe5996daa8c456e939250905b808210611631575090915081016020016115cd826115bd565b919260018160209254838588010152019101909291611618565b60ff191660208087019190915292151560051b850190920192506115cd91508390506115bd565b50346103695761168136612b52565b61168c929192613205565b828252603c602052604082209260098401548015908115611a35575b50611a26576005840154611a17578115611a095782546050810281158282046050148117156119f5576096830292830460961417156119e1576064900483109081156119d4575b506119c5576116fd81613112565b92600260018060a01b036008870154169501549061171a83613112565b6001600160a01b0316331415806119a0575b80611999575b61198a57828152603c602052600560408220015461197b575081600052603c602052604060002092811561196a5760028401805483116119595761177886838587613a26565b8698939198959295986000958554808610611915575b507f2f61af559bf23be05bd7bb2fe5574529caa9a0176cc730cc3dc0d1bd40ec937560206117be8b60055461301a565b80600555604051908152a180548980820361190557505042600587015560018601859055600081556001600160a01b036117f78b61317d565b16156118f0575b5496600786015493600687015496600860018060a01b0391015416986040519a8b5260208b015260408a01526060890152608088015260a087015260c086015260e08501526101008401526101208301526101408201527f1291b17e4c611ac722f03763ded81e523d2aa81f5ca80b235aba2fcbe7a0d31761016060018060a01b03861692a38061188b57005b60405163a9059cbb60e01b81526001600160a01b03929092166004830152602482015290602090829060449082906000905af180156118e4576118ca57005b6118e29060203d602011610e8857610e7b8183612bc2565b005b6040513d6000823e3d90fd5b89637e27328960e01b60005260045260246000fd5b61190e9161301a565b81556117fe565b61192e919b50856119289198939861301a565b89612b68565b6305f5e10091500494611952866007870161194a828254612e3c565b90558961301a565b993861178e565b631e9acf1760e31b60005260046000fd5b631f2a200560e01b60005260046000fd5b63219ce9a360e01b8152600490fd5b636d8a29e760e11b8152600490fd5b5080611732565b506119aa83613112565b50336001600160a01b036119bd85613143565b16141561172c565b630df22a0f60e21b8352600483fd5b60649150048211386116ef565b634e487b7160e01b85526011600452602485fd5b634e487b7160e01b86526011600452602486fd5b62bfc92160e01b8352600483fd5b63219ce9a360e01b8352600483fd5b6309f7a15560e11b8352600483fd5b9050421115386116a8565b50346103695760403660031901126103695760ff6040602092611a61612a52565b6004358252600080516020613d0683398151915285528282206001600160a01b03909116825284522054604051911615158152f35b503461036957602036600319011261036957600435611ab36132ca565b8015611afe5760807fc6d3da45896ce1bca9d198309a2dbeea3c73a991748f8d88d796ffa06029de93918354908085556040519182526020820152836040820152426060820152a180f35b634dfba02360e01b8252600482fd5b5034610369578060031936011261036957600080516020613ce6833981519152546040516001600160a01b039091168152602090f35b503461036957602036600319011261036957611b5d612a3c565b611b65613205565b6001600160a01b0381168015611bce57600280546001600160a01b031981169092179055604080516001600160a01b0392831681529190921660208201527f906ff2422a6ffa134f2d7ccaffd446bc0c583a5cb6615749b4b2836942a5fea89181908101610c77565b636a27e5f160e01b8352600483fd5b50346103695780600319360112610369575060206305f5e100604051908152f35b5034610369578060031936011261036957602060405160968152f35b503461036957606036600319011261036957600435611c37612a52565b90604435918115611f3e576001600160a01b038116611f38575033905b6001546040516323b872dd60e01b815233600482015230602482015260448101839052906020908290606490829089906001600160a01b03165af18015611f2d57611f10575b506004549260001984146119e15760018401600455845460018060a01b03600154166040519161014083018381106001600160401b03821117611efc57918491600993604052845283888a60208301818152604084018a815260608501908b82526080860192428452604060a088019580875260c089019781895261012060e08b019a838c5261010081019c8d52019b8c528152603c602052209a518b555160018b01555160028a015551600389015551600488015551600587015551600686015551600785015560018060a01b03905116600884019060018060a01b03166001600160601b0360a01b825416179055519101557f2f61af559bf23be05bd7bb2fe5574529caa9a0176cc730cc3dc0d1bd40ec93756020611dbd84600554612e3c565b80600555604051908152a16001600160a01b038316928315611ee857611de2856139c0565b6001600160a01b0381168015159287918791611e029086611ec957612e61565b80546001019055828a52600080516020613d2683398151915260205260408a2080546001600160a01b031916831790557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8a80a450611eb55760a08493927ff5097c6b4689824558e56b486a27d0a598420ba3453bb2988e15785271d06725926020975491600180851b0360015416906040519384528984015242604084015260608301526080820152a3604051908152f35b6339e3563760e11b85526004859052602485fd5b611ed2856139e8565b611edb86612e61565b8054600019019055612e61565b633250574960e11b86526004869052602486fd5b634e487b7160e01b89526041600452602489fd5b611f289060203d602011610e8857610e7b8183612bc2565b611c9a565b6040513d87823e3d90fd5b90611c54565b631f2a200560e01b8452600484fd5b503461036957611f5c36612b52565b60ff6007939293541615611fea57611f928383948452603c60205260018060a01b036008604086200154169284549033926136d5565b80611f9b575050f35b60405163a9059cbb60e01b815233600482015260248101919091529160209183916044918391905af180156110ab57611fd2575080f35b610b669060203d602011610e8857610e7b8183612bc2565b6333962fd760e01b8252600482fd5b5034610369576020366003190112610369576004358015610ea9576002546040516323b872dd60e01b81523360048201523060248201526044810183905291906020908390606490829087906001600160a01b03165af1908115610e8f577fc04c302bacaef8c9bec8841c7f0dffba5a121e12e14b6a52f9fc9940ecf0d7aa926040926120a1575b5061208f6008549182612e3c565b8060085582519182526020820152a180f35b6120b99060203d602011610e8857610e7b8183612bc2565b612081565b50346103695780600319360112610369576120d761398a565b600080516020613ce683398151915280546001600160a01b0319811690915581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b503461036957602036600319011261036957612142612a3c565b906001600160a01b0382161561216657602061215d83612e61565b54604051908152f35b6322718ad960e21b81526004819052602490fd5b50346103695780600319360112610369576020600954604051908152f35b50346103695760203660031901126103695760206121b7600435613112565b6040516001600160a01b039091168152f35b50346103695780600319360112610369576003546040516001600160a01b039091168152602090f35b50346103695760203660031901126103695760043580151580910361050c5760207f29ba88224264632c83574215c72146e3239d91512d22b3b47194eb28bc26aa359161223d61398a565b60ff196007541660ff821617600755604051908152a180f35b50346103695761226536612ad2565b9060ff60079594939554161561238e5781850361128057841561124c5782358452603c60205260408420600801546001600160a01b0316928492839291905b8784106122b8578680878780611f9b575050f35b909192936122c7858985612e1c565b358752603c60205260408720600801546001600160a01b0316869003612323576123196001916123136122fb888c88612e1c565b3561230789878a612e1c565b359033918c54916136d5565b90612e3c565b94019291906122a4565b60405162461bcd60e51b815260206004820152603a60248201527f416c6c20706f736974696f6e73206d75737420757365207468652073616d652060448201527f746f6b656e20666f722062617463682070726f63657373696e670000000000006064820152608490fd5b6333962fd760e01b8452600484fd5b50346103695780600319360112610369576020600654604051908152f35b5034610369576020366003190112610369576004356001600160401b03811161050c576123ec903690600401612b22565b906123f56132ca565b811561247357611f40821161121057825490835b838110612414578480f35b807fc6d3da45896ce1bca9d198309a2dbeea3c73a991748f8d88d796ffa06029de9360806124456001948887612e2c565b356020612453858a89612e2c565b01356040519188835260208301528960408301526060820152a101612409565b60405162461bcd60e51b815260206004820152600b60248201526a456d70747920617272617960a81b6044820152606490fd5b503461036957610bed6124b836612a68565b90604051926124c8602085612bc2565b858452612ed3565b5034610369576040366003190112610369576124ea612a52565b336001600160a01b0382160361250657610b6690600435613635565b63334bd91960e11b8252600482fd5b50346103695760203660031901126103695761252f612a3c565b612537613205565b6001600160a01b03811680156125a057600180546001600160a01b031981169092179055604080516001600160a01b0392831681529190921660208201527fce76357c57fa1f65ea8fb41c18f6a9bac76156984fee9e0f25a24b66977bb59d9181908101610c77565b63c2cf440960e01b8352600483fd5b503461036957604036600319011261036957610b666004356125cf612a52565b906125dc610ee582612dfb565b61359e565b503461036957602036600319011261036957610b666125fe612a3c565b612606613277565b613386565b50346103695761261a36612ad2565b9291612624613205565b83810361128057801561124c57611f40811161121057845b818110612647578580f35b612652818685612e1c565b35156126d957612663818386612e1c565b358652603c60205260408620600581015461120157805460019291612689838988612e1c565b3590557f5e176ab3e891f654de569024045b7a17e243b1148cd50179f3c73c79edbb96e960406126ba84878a612e1c565b35926126c7858b8a612e1c565b3582519182526020820152a20161263c565b634dfba02360e01b8652600486fd5b5034610369576020366003190112610369576020612707600435612dfb565b604051908152f35b503461036957610bed61272136612a68565b91612c6d565b50346103695780600319360112610369576020600554604051908152f35b5034610369578060031936011261036957602060ff600754166040519015158152f35b50346103695780600319360112610369576020604051620f42408152f35b5034610369576040366003190112610369576127a0612a3c565b6024356127ac81613112565b3315158061286d575b8061284f575b61283c5781906001600160a01b0384811691167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258680a482527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab00793046020526040822080546001600160a01b0319166001600160a01b0390921691909117905580f35b63a9fbf51f60e01b845233600452602484fd5b5061285981612e9a565b338552602052604084205460ff16156127bb565b506001600160a01b0381163314156127b5565b50346103695760203660031901126103695760206121b76004356128a381613112565b50613143565b50346103695780600319360112610369576040519080600080516020613cc683398151915254906128d982612c33565b808552916001811690811561164b575060011461290057610f63846115cd81860382612bc2565b600080516020613cc68339815191528152600080516020613d86833981519152939250905b80821061293e575090915081016020016115cd826115bd565b919260018160209254838588010152019101909291612925565b5034610369578060031936011261036957602060405160508152f35b90503461050c57602036600319011261050c5760043563ffffffff60e01b81168091036113625760209250637965db0b60e01b81149081156129b8575b5015158152f35b6380ac58cd60e01b8114915081156129ea575b81156129d9575b50386129b1565b6301ffc9a760e01b149050386129d2565b635b5e139f60e01b811491506129cb565b919082519283825260005b848110612a27575050826000602080949584010152601f8019910116010190565b80602080928401015182828601015201612a06565b600435906001600160a01b0382168203610b0e57565b602435906001600160a01b0382168203610b0e57565b6060906003190112610b0e576004356001600160a01b0381168103610b0e57906024356001600160a01b0381168103610b0e579060443590565b9181601f84011215610b0e578235916001600160401b038311610b0e576020808501948460051b010111610b0e57565b6040600319820112610b0e576004356001600160401b038111610b0e5781612afc91600401612aa2565b92909291602435906001600160401b038211610b0e57612b1e91600401612aa2565b9091565b9181601f84011215610b0e578235916001600160401b038311610b0e576020808501948460061b010111610b0e57565b6040906003190112610b0e576004359060243590565b81810292918115918404141715612b7b57565b634e487b7160e01b600052601160045260246000fd5b604081019081106001600160401b03821117612bac57604052565b634e487b7160e01b600052604160045260246000fd5b90601f801991011681019081106001600160401b03821117612bac57604052565b6001600160401b038111612bac57601f01601f191660200190565b603d54811015612c1d57603d60005260206000209060011b0190600090565b634e487b7160e01b600052603260045260246000fd5b90600182811c92168015612c63575b6020831014612c4d57565b634e487b7160e01b600052602260045260246000fd5b91607f1691612c42565b909291906001600160a01b0384168015612de557600094612c8d846139c0565b9533151580612d4c575b509184917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef612cd897989460018060a01b03861698899384612d3a57612e61565b80546001019055848152600080516020613d268339815191526020526040812080546001600160a01b0319168517905580a4506001600160a01b0316808303612d2057505050565b6364283d7b60e01b60005260045260245260445260646000fd5b612d43876139e8565b611edb88612e61565b80612d95575b15612d5d5738612c97565b84906001600160a01b038816612d7f57602491637e27328960e01b8252600452fd5b60449163177e802f60e01b825233600452602452fd5b506001600160a01b03871633148015612dc8575b80612d525750336001600160a01b03612dc187613143565b1614612d52565b50612dd287612e9a565b338252602052604081205460ff16612da9565b633250574960e11b600052600060045260246000fd5b600052600080516020613d0683398151915260205260016040600020015490565b9190811015612c1d5760051b0190565b9190811015612c1d5760061b0190565b91908201809211612b7b57565b90816020910312610b0e57518015158103610b0e5790565b6001600160a01b031660009081527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab00793036020526040902090565b6001600160a01b031660009081527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab00793056020526040902090565b9291612ee0818386612c6d565b813b612eed575b50505050565b604051630a85bd0160e11b81523360048201526001600160a01b0394851660248201526044810191909152608060648201529216919060209082908190612f389060848301906129fb565b03816000865af18091600091612fd7575b5090612fa257503d15612f9b573d612f6081612be3565b90612f6e6040519283612bc2565b81523d6000602083013e5b80519081612f965782633250574960e11b60005260045260246000fd5b602001fd5b6060612f79565b6001600160e01b03191663757a42ff60e11b01612fc3575038808080612ee7565b633250574960e11b60005260045260246000fd5b6020813d602011613012575b81612ff060209383612bc2565b8101031261050c5751906001600160e01b031982168203610369575038612f49565b3d9150612fe3565b91908203918211612b7b57565b6001600160a01b0316801561308757600080516020613ce683398151915280546001600160a01b0319811683179091556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b631e4fbdf760e01b600052600060045260246000fd5b603d5468010000000000000000811015612bac5760018101603d556000603d548210156130fe57603d905260011b7fece66cfdbd22e3f37d348a3d8e19074452862cd65fd4b9a11f0336d1ac6d1dc301906020816001925184550151910155565b634e487b7160e01b81526032600452602490fd5b61311b816139c0565b906001600160a01b0382161561312f575090565b637e27328960e01b60005260045260246000fd5b60009081527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab007930460205260409020546001600160a01b031690565b613186816139c0565b9060006001600160a01b038316806131e7575b828252600080516020613d268339815191526020526040822080546001600160a01b03191690557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a490565b6131f0836139e8565b6131f984612e61565b82198154019055613199565b3360009081527f448256db8f8fb95ee3eaaf89c1051414494e85cebb6057fcf996cc3d0ccfb456602052604090205460ff161561323e57565b63e2517d3f60e01b600052336004527f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b92960245260446000fd5b3360009081527fb7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d602052604090205460ff16156132b057565b63e2517d3f60e01b60005233600452600060245260446000fd5b3360009081527f9cfad5238ce3e0b54cbca0820bf2b02d66d496527d1fa42cb60bdcdd96bd88ab602052604090205460ff161561330357565b63e2517d3f60e01b600052336004527f04824fcb60e7cc526d70b264caa65b62ed44d9c8e5d230e8ff6b0c7373843b8a60245260446000fd5b6000818152600080516020613d068339815191526020908152604080832033845290915290205460ff161561336e5750565b63e2517d3f60e01b6000523360045260245260446000fd5b6001600160a01b03811660009081527f448256db8f8fb95ee3eaaf89c1051414494e85cebb6057fcf996cc3d0ccfb456602052604090205460ff16613442576001600160a01b031660008181527f448256db8f8fb95ee3eaaf89c1051414494e85cebb6057fcf996cc3d0ccfb45660205260408120805460ff191660011790553391907f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b92990600080516020613ca68339815191529080a4600190565b50600090565b6001600160a01b03811660009081527f9cfad5238ce3e0b54cbca0820bf2b02d66d496527d1fa42cb60bdcdd96bd88ab602052604090205460ff16613442576001600160a01b031660008181527f9cfad5238ce3e0b54cbca0820bf2b02d66d496527d1fa42cb60bdcdd96bd88ab60205260408120805460ff191660011790553391907f04824fcb60e7cc526d70b264caa65b62ed44d9c8e5d230e8ff6b0c7373843b8a90600080516020613ca68339815191529080a4600190565b6001600160a01b03811660009081527fb7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d602052604090205460ff16613442576001600160a01b031660008181527fb7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d60205260408120805460ff19166001179055339190600080516020613ca68339815191528180a4600190565b6000818152600080516020613d06833981519152602090815260408083206001600160a01b038616845290915290205460ff1661362e576000818152600080516020613d06833981519152602090815260408083206001600160a01b0395909516808452949091528120805460ff1916600117905533929190600080516020613ca68339815191529080a4600190565b5050600090565b6000818152600080516020613d06833981519152602090815260408083206001600160a01b038616845290915290205460ff161561362e576000818152600080516020613d06833981519152602090815260408083206001600160a01b0395909516808452949091528120805460ff19169055339291907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080a4600190565b91926136e083613112565b6001600160a01b031633141580613965575b8061395d575b61394c5782600052603c60205260056040600020015461393b5782600052603c602052600960406000200154151580613921575b6139105782600052603c602052604060002093821561196a5760028501805484116119595761375d83838688613a26565b87999391999592959960009585548086106138cc575b507f2f61af559bf23be05bd7bb2fe5574529caa9a0176cc730cc3dc0d1bd40ec937560206137a38c60055461301a565b80600555604051908152a189815480821460001461388e57505042600587015560018601859055600081556001600160a01b036137df8c61317d565b16156138795791610160979593917f1291b17e4c611ac722f03763ded81e523d2aa81f5ca80b235aba2fcbe7a0d317999795935b5460078601546006870154600890970154604080519e8f5260208f0193909352918d019490945260608c019790975260808b015260a08a015260c089015260e08801526101008701526101208601526001600160a01b039081166101408601521692a390565b8a637e27328960e01b60005260045260246000fd5b916138c56101609a989694927f1291b17e4c611ac722f03763ded81e523d2aa81f5ca80b235aba2fcbe7a0d3179c9a98969461301a565b8155613813565b6138e5919c50856138df9198939861301a565b8a612b68565b6305f5e100915004946139098660078701613901828254612e3c565b90558a61301a565b9a38613773565b6315ff94d360e11b60005260046000fd5b5082600052603c602052600960406000200154421161372c565b63219ce9a360e01b60005260046000fd5b636d8a29e760e11b60005260046000fd5b5060016136f8565b5061396f83613112565b50336001600160a01b0361398285613143565b1614156136f2565b600080516020613ce6833981519152546001600160a01b031633036139ab57565b63118cdaa760e01b6000523360045260246000fd5b6000908152600080516020613d2683398151915260205260409020546001600160a01b031690565b6000527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab007930460205260406000206001600160601b0360a01b8154169055565b919091600052603c60205260406000209182549182811115613c6457613a5592613a4f9161301a565b90612b68565b6305f5e1009004928315613c5657613a7160048301544261301a565b93603d5460009560005b828110613c2157505050612710613a928683612b68565b04936006613aa0868461301a565b9401613aad838254612e3c565b9055846009549181613bb8575b505083151580613ba4575b613b0f575b60407f903baec967bd87828705b3a5cfaffa06bd05cf4d6b29bbc0c10318dfa1918de291613afa84600954612e3c565b8060095582519182526020820152a193929190565b60025460035460405163a9059cbb60e01b81526001600160a01b03918216600482015260248101879052929160209184916044918391600091165af19081156118e4577f903baec967bd87828705b3a5cfaffa06bd05cf4d6b29bbc0c10318dfa1918de292604092613b85575b50915050613aca565b613b9d9060203d602011610e8857610e7b8183612bc2565b5038613b7c565b506003546001600160a01b03161515613ac5565b60025460405163a9059cbb60e01b81526001600160a01b039283166004820152602481019390935260209183916044918391600091165af180156118e457613c02575b8590613aba565b613c1a9060203d602011610e8857610e7b8183612bc2565b5038613bfb565b6001613c2c82612bfe565b500154821015613c3f575b600101613a7b565b96506001613c4c88612bfe565b5054979050613c37565b600093508392508291508190565b5050505050600090600090600090600090565b60ff600080516020613d468339815191525460401c1615613c9457565b631afcd79f60e31b60005260046000fdfe2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab00793009016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930002dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680080bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab0079302f0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0080bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab007930137c58c799b6609234b945e882912ee9ad34948a1dfaa20a97485e1a7752bbf81a26469706673582212201ada232246124c468b6f5b0a190b6dfff21c3c6a67394a7ffda833159452d0c064736f6c634300081c0033",
|
2038
|
+
"bytecode": "0x6080806040523460d2577ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005460ff8160401c1660c1576002600160401b03196001600160401b03821601605c575b60405161414f90816100d88239f35b6001600160401b0319166001600160401b039081177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005581527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a13880604d565b63f92ee8a960e01b60005260046000fd5b600080fdfe608080604052600436101561001357600080fd5b600090813560e01c90816301ffc9a714612ba15750806303e0ac8614612b8557806306fdde0314612ad6578063081812fc14612aad578063095ea7b3146129b35780630d8317e1146129955780630ead7712146129725780631a39d8ef1461295457806323b872dd1461293c578063248a9ca31461291557806324e3fef71461283857806327ac0c581461280e5780632f2ff15d146127dc5780632f84c3911461274257806336568abe146126fd57806342842e0e146126d35780634796ed04146125e85780634c19386c146125ca578063537b1ec714612483578063572a23351461238f57806358f678691461232b57806359302cbf1461230d5780635c418b791461228257806361d027b3146122595780636352211e146122285780636eac61dd1461220a57806370a08231146121b8578063715018a61461214e57806374de4ec41461208957806375a0b6dd14611fdd5780637949227214611caa57806387173a8e14611c8e57806387c1394314611c6d5780638aee812714611bd35780638da5cb5b14611b9d57806391b7f5ed14611b2657806391d1485414611ad057806394a868a3146116d757806395d89b41146115da57806399fbab8814611543578063a035b1fe14611526578063a0d8d78c146113e7578063a217fddf146113cb578063a22cb4651461132a578063a5d87770146111ad578063b2bad5b21461114d578063b35fb54214611059578063b69e5c7714611020578063b88d4fde14610f93578063c87b56dd14610f38578063cfdbf25414610f1b578063d547741f14610ee4578063d797fe2214610de5578063da29b26514610da6578063e16fd0ec14610d89578063e5a6b10f14610d60578063e985e9c514610d11578063eae86f0b14610cf3578063f00acbaa14610cb8578063f0f4426014610c1c578063f2fde38b14610bef578063f36de22514610bd1578063f5b541a614610b96578063f6a48fac14610b68578063f7c618c114610b3f578063f8c8765e1461053c578063fbc14dda146103985763fc420e6b1461030d57600080fd5b346103955761031b36612d7f565b610323613432565b801561038657818352603c602052604083209060058201546103775781816040927f5e176ab3e891f654de569024045b7a17e243b1148cd50179f3c73c79edbb96e99454925582519182526020820152a280f35b63219ce9a360e01b8452600484fd5b634dfba02360e01b8352600483fd5b80fd5b5034610395576020366003190112610395576004356001600160401b038111610538576103c9903690600401612d4f565b906103d2613432565b603d5483603d55806104aa575b508290815b83831061041357847fdb840036dd546f2fc2b3a5a3807bc68f2b180b4a08b42c51429def8f7be480b68180a180f35b6127106104218486856130cb565b351161049b5760206104348486856130cb565b0135111561048c5761047361044a8385846130cb565b3560206104588587866130cb565b01356040519161046783612e30565b825260208201526132ca565b600160206104828486856130cb565b01359201916103e4565b637616640160e01b8452600484fd5b636093dc5160e01b8552600485fd5b6001600160ff1b038116810361052457603d845260011b7fece66cfdbd22e3f37d348a3d8e19074452862cd65fd4b9a11f0336d1ac6d1dc3017fece66cfdbd22e3f37d348a3d8e19074452862cd65fd4b9a11f0336d1ac6d1dc35b81811061051257506103df565b80856002925585600182015501610505565b634e487b7160e01b84526011600452602484fd5b5080fd5b503461039557608036600319011261039557610556612c69565b61055e612c7f565b6044356001600160a01b03811690819003610b3a57606435906001600160a01b038216808303610b3a576000805160206140ba833981519152549360ff8560401c1615946001600160401b03811680159081610b32575b6001149081610b28575b159081610b1f575b50610b105767ffffffffffffffff1981166001176000805160206140ba8339815191525585610ae3575b5060409586516106018882612e61565b60158152742a3930b234b733ab30bab63a102837b9b4ba34b7b760591b60208201528751906106308983612e61565b6002825261056560f41b6020830152610647613f3a565b61064f613f3a565b8051906001600160401b038211610acf57819061067a60008051602061403a83398151915254612ed2565b601f8111610a4d575b50602090601f83116001146109c2578c926109b7575b50508160011b916000199060031b1c19161760008051602061403a833981519152555b8051906001600160401b0382116109a35781906106e76000805160206140da83398151915254612ed2565b601f8111610928575b50602090601f83116001146108a9578b9261089e575b50508160011b916000199060031b1c1916176000805160206140da833981519152555b610731613f3a565b610739613f3a565b61074285613254565b61074a613f3a565b6001600160a01b031690811561088f576001600160a01b0316918215610880578315610871571561086257906107c19392916001600160601b0360a01b60015416176001556001600160601b0360a01b60025416176002556001600160601b0360a01b60035416176003556305f5e1008555613731565b506107cb336135b3565b506107d533613675565b506107f482516107e481612e30565b61271081528460208201526132ca565b600160ff196007541617600755610809575080f35b60207fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29168ff0000000000000000196000805160206140ba83398151915254166000805160206140ba833981519152555160018152a180f35b630702b3d960e41b8752600487fd5b63cfe2ea6360e01b8852600488fd5b636a27e5f160e01b8852600488fd5b63c2cf440960e01b8852600488fd5b015190503880610706565b6000805160206140da8339815191528c52818c209250601f1984168c5b81811061091057509084600195949392106108f7575b505050811b016000805160206140da83398151915255610729565b015160001960f88460031b161c191690553880806108dc565b929360206001819287860151815501950193016108c6565b6000805160206140da8339815191528c529091507ff4bad0a69248f59680a4f2b3000328cec71a413447c96781cfe5996daa8c456e601f840160051c81019160208510610999575b90601f859493920160051c01905b81811061098b57506106f0565b8c815584935060010161097e565b9091508190610970565b634e487b7160e01b8a52604160045260248afd5b015190503880610699565b60008051602061403a8339815191528d526000805160206140fa8339815191529250601f1984168d5b818110610a355750908460019594939210610a1c575b505050811b0160008051602061403a833981519152556106bc565b015160001960f88460031b161c19169055388080610a01565b929360206001819287860151815501950193016109eb565b90915060008051602061403a8339815191528c52601f830160051c6000805160206140fa833981519152019060208410610ab9575b90601f8493920160051c6000805160206140fa83398151915201905b818110610aab5750610683565b8d8155849350600101610a9e565b6000805160206140fa8339815191529150610a82565b634e487b7160e01b8b52604160045260248bfd5b68ffffffffffffffffff191668010000000000000001176000805160206140ba83398151915255386105f1565b63f92ee8a960e01b8852600488fd5b905015386105c7565b303b1591506105bf565b8791506105b5565b600080fd5b50346103955780600319360112610395576002546040516001600160a01b039091168152602090f35b503461039557602036600319011261039557610b92610b85612c69565b610b8d6134a4565b613675565b5080f35b503461039557806003193601126103955760206040517f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b9298152f35b50346103955780600319360112610395576020603d54604051908152f35b503461039557602036600319011261039557610c19610c0c612c69565b610c14613c44565b613254565b80f35b503461039557602036600319011261039557610c36612c69565b610c3e613c44565b6001600160a01b0381168015610ca957600380546001600160a01b031981169092179055604080516001600160a01b0392831681529190921660208201527f4ab5be82436d353e61ca18726e984e561f5c1cc7c6d38b29d2553c790434705a91819081015b0390a180f35b63cfe2ea6360e01b8352600483fd5b503461039557806003193601126103955760206040517f04824fcb60e7cc526d70b264caa65b62ed44d9c8e5d230e8ff6b0c7373843b8a8152f35b50346103955780600319360112610395576020600854604051908152f35b503461039557604036600319011261039557610d2b612c69565b610d3c610d36612c7f565b91612df7565b9060018060a01b0316600052602052602060ff604060002054166040519015158152f35b50346103955780600319360112610395576001546040516001600160a01b039091168152602090f35b503461039557806003193601126103955760206040516127108152f35b50346103955760203660031901126103955760043590603d54821015610395576040610dd183612e9d565b506001815491015482519182526020820152f35b5034610395576020366003190112610395576004358015610ed5576006548111610ec6576001546040516323b872dd60e01b815233600482015230602482015260448101839052906020908290606490829087906001600160a01b03165af18015610ebb57610e8e575b50610e5c81600654613100565b6006556040519081527f1ddc8f26f8c3c076f9978db18d22e7b427b1a630289eda0ff2e784501db7225360203392a280f35b610eaf9060203d602011610eb4575b610ea78183612e61565b8101906130e8565b610e4f565b503d610e9d565b6040513d85823e3d90fd5b63e480bdff60e01b8252600482fd5b631f2a200560e01b8252600482fd5b503461039557604036600319011261039557610b92600435610f04612c7f565b90610f16610f118261309a565b613569565b613862565b50346103955780600319360112610395576020604051611f408152f35b503461039557602036600319011261039557610f5560043561333f565b5060209080604051610f678482612e61565b525060405190610f778183612e61565b60008252610f8f604051928284938452830190612c28565b0390f35b503461039557608036600319011261039557610fad612c69565b610fb5612c7f565b90606435906001600160401b03821161101c573660238301121561101c5781600401359284610fe385612e82565b93610ff16040519586612e61565b85855236602487830101116105385785610c199660246020930183880137850101526044359161310d565b8380fd5b5034610395576020366003190112610395576020906040906001600160a01b03611048612c69565b168152603e83522054604051908152f35b503461039557604036600319011261039557611073612c69565b60243561107e613c44565b6001546001600160a01b03928316921682148015611139575b61112a57801561111b5760405163a9059cbb60e01b81523360048201526024810191909152906020908290604490829086905af19081156111105782916110f1575b50156110e25780f35b63360e42e160e01b8152600490fd5b61110a915060203d602011610eb457610ea78183612e61565b386110d9565b6040513d84823e3d90fd5b631f2a200560e01b8352600483fd5b63e3542bf760e01b8352600483fd5b506002546001600160a01b03168214611097565b50346103955761115c36612d7f565b611164613432565b818352603c60205260408320600581015461037757817f4543fdb253b6e350e8c47f75076648def2738cf8ad1c799f5bc933a07dfb2a0d9260096020930155604051908152a280f35b5034610395576111bc36612cff565b92916111c6613432565b8381036112e55780156112b157611f40811161127557845b8181106111e9578580f35b6111f48183866130bb565b358652603c6020526040862060058101546112665790600191600961121a8389886130bb565b359101556112298184876130bb565b357f4543fdb253b6e350e8c47f75076648def2738cf8ad1c799f5bc933a07dfb2a0d6020611258848a896130bb565b35604051908152a2016111de565b63219ce9a360e01b8752600487fd5b60405162461bcd60e51b815260206004820152601460248201527342617463682073697a6520746f6f206c6172676560601b6044820152606490fd5b60405162461bcd60e51b815260206004820152600c60248201526b456d7074792061727261797360a01b6044820152606490fd5b60405162461bcd60e51b815260206004820152601860248201527f4172726179206c656e67746873206d757374206d6174636800000000000000006044820152606490fd5b503461039557604036600319011261039557611344612c69565b602435908115158092036113c7576001600160a01b03169081156113b35761136b33612df7565b82600052602052604060002060ff1981541660ff83161790556040519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a380f35b630b61174360e31b83526004829052602483fd5b8280fd5b5034610395578060031936011261039557602090604051908152f35b503461039557602036600319011261039557600435611404613c44565b8015610ed5576001546040516370a0823160e01b81523060048201526001600160a01b0390911690602081602481855afa90811561151b5784916114e9575b5082116114da5760405163a9059cbb60e01b815233600482015260248101839052906020908290604490829087905af18015610ebb576114bd575b5061148b816006546130db565b6006556040519081527f2c2d88bb2c04a245a8df31f649252cce1de7bf7ac17d3555f3b7530f968f8d0660203392a280f35b6114d59060203d602011610eb457610ea78183612e61565b61147e565b631e9acf1760e31b8352600483fd5b90506020813d602011611513575b8161150460209383612e61565b8101031261101c575138611443565b3d91506114f7565b6040513d86823e3d90fd5b503461039557806003193601126103955760209054604051908152f35b5034610395576020366003190112610395576040610140916004358152603c60205220805490600181015490600281015460038201546004830154600584015490600685015492600786015494600960018060a01b0360088901541697015497604051998a5260208a015260408901526060880152608087015260a086015260c085015260e0840152610100830152610120820152f35b503461039557806003193601126103955760405190806000805160206140da833981519152549061160a82612ed2565b80855291600181169081156116b05750600114611646575b610f8f8461163281860382612e61565b604051918291602083526020830190612c28565b6000805160206140da83398151915281527ff4bad0a69248f59680a4f2b3000328cec71a413447c96781cfe5996daa8c456e939250905b8082106116965750909150810160200161163282611622565b91926001816020925483858801015201910190929161167d565b60ff191660208087019190915292151560051b850190920192506116329150839050611622565b5034610395576116e636612d7f565b6116f1929192613432565b828252603c602052604082209260098401548015908115611ac5575b50611ab6576005840154611aa7578115611a99578254605081028115828204605014811715611a8557609683029283046096141715611a7157606490048310908115611a64575b50611a55576117628161333f565b92600260018060a01b036008870154169501549061177f8361333f565b6001600160a01b031633141580611a30575b80611a29575b611a1a57828152603c6020526005604082200154611a0b575081600052603c60205260406000209281156119fa576002840190815483116119e95782946000918154808210611976575b506117ee88828789613ce0565b91967f2f61af559bf23be05bd7bb2fe5574529caa9a0176cc730cc3dc0d1bd40ec9375602061181f8b600554613100565b80600555604051908152a180548980820361196657505042600587015560018601859055600081556001600160a01b036118588b6133aa565b1615611951575b5496600786015493600687015496600860018060a01b0391015416986040519a8b5260208b015260408a01526060890152608088015260a087015260c086015260e08501526101008401526101208301526101408201527f1291b17e4c611ac722f03763ded81e523d2aa81f5ca80b235aba2fcbe7a0d31761016060018060a01b03861692a3806118ec57005b60405163a9059cbb60e01b81526001600160a01b03929092166004830152602482015290602090829060449082906000905af180156119455761192b57005b6119439060203d602011610eb457610ea78183612e61565b005b6040513d6000823e3d90fd5b89637e27328960e01b60005260045260246000fd5b61196f91613100565b815561185f565b8161198e929493985061198891613100565b85612d95565b6305f5e100915004948591600782016119a88882546130db565b90556119e36119b78887613100565b6001600160a01b038a166000908152603e602052604090205490986119dc90826130db565b908a613be2565b386117e1565b631e9acf1760e31b60005260046000fd5b631f2a200560e01b60005260046000fd5b63219ce9a360e01b8152600490fd5b636d8a29e760e11b8152600490fd5b5080611797565b50611a3a8361333f565b50336001600160a01b03611a4d85613370565b161415611791565b630df22a0f60e21b8352600483fd5b6064915004821138611754565b634e487b7160e01b85526011600452602485fd5b634e487b7160e01b86526011600452602486fd5b62bfc92160e01b8352600483fd5b63219ce9a360e01b8352600483fd5b6309f7a15560e11b8352600483fd5b90504211153861170d565b50346103955760403660031901126103955760ff6040602092611af1612c7f565b600435825260008051602061407a83398151915285528282206001600160a01b03909116825284522054604051911615158152f35b503461039557602036600319011261039557600435611b436134f7565b8015611b8e5760807fc6d3da45896ce1bca9d198309a2dbeea3c73a991748f8d88d796ffa06029de93918354908085556040519182526020820152836040820152426060820152a180f35b634dfba02360e01b8252600482fd5b503461039557806003193601126103955760008051602061405a833981519152546040516001600160a01b039091168152602090f35b503461039557602036600319011261039557611bed612c69565b611bf5613432565b6001600160a01b0381168015611c5e57600280546001600160a01b031981169092179055604080516001600160a01b0392831681529190921660208201527f906ff2422a6ffa134f2d7ccaffd446bc0c583a5cb6615749b4b2836942a5fea89181908101610ca3565b636a27e5f160e01b8352600483fd5b50346103955780600319360112610395575060206305f5e100604051908152f35b5034610395578060031936011261039557602060405160968152f35b503461039557606036600319011261039557600435611cc7612c7f565b90604435918115611fce576001600160a01b038116611fc8575033905b6001546040516323b872dd60e01b815233600482015230602482015260448101839052906020908290606490829089906001600160a01b03165af18015611fbd57611fa0575b50600454926000198414611a715760018401600455845460018060a01b03600154166040519161014083018381106001600160401b03821117611f8c57918491600993604052845283888a60208301818152604084018a815260608501908b82526080860192428452604060a088019580875260c089019781895261012060e08b019a838c5261010081019c8d52019b8c528152603c602052209a518b555160018b01555160028a015551600389015551600488015551600587015551600686015551600785015560018060a01b03905116600884019060018060a01b03166001600160601b0360a01b825416179055519101557f2f61af559bf23be05bd7bb2fe5574529caa9a0176cc730cc3dc0d1bd40ec93756020611e4d846005546130db565b80600555604051908152a16001600160a01b038316928315611f7857611e7285613c7a565b6001600160a01b0381168015159287918791611e929086611f5957612dbe565b80546001019055828a5260008051602061409a83398151915260205260408a2080546001600160a01b031916831790557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8a80a450611f455760a08493927ff5097c6b4689824558e56b486a27d0a598420ba3453bb2988e15785271d06725926020975491600180851b0360015416906040519384528984015242604084015260608301526080820152a3604051908152f35b6339e3563760e11b85526004859052602485fd5b611f6285613ca2565b611f6b86612dbe565b8054600019019055612dbe565b633250574960e11b86526004869052602486fd5b634e487b7160e01b89526041600452602489fd5b611fb89060203d602011610eb457610ea78183612e61565b611d2a565b6040513d87823e3d90fd5b90611ce4565b631f2a200560e01b8452600484fd5b503461039557611fec36612d7f565b60ff600793929354161561207a576120228383948452603c60205260018060a01b03600860408620015416928454903392613902565b8061202b575050f35b60405163a9059cbb60e01b815233600482015260248101919091529160209183916044918391905af1801561111057612062575080f35b610b929060203d602011610eb457610ea78183612e61565b6333962fd760e01b8252600482fd5b5034610395576020366003190112610395576004358015610ed5576002546040516323b872dd60e01b81523360048201523060248201526044810183905291906020908390606490829087906001600160a01b03165af1908115610ebb577fc04c302bacaef8c9bec8841c7f0dffba5a121e12e14b6a52f9fc9940ecf0d7aa92604092612131575b5061211f60085491826130db565b8060085582519182526020820152a180f35b6121499060203d602011610eb457610ea78183612e61565b612111565b5034610395578060031936011261039557612167613c44565b60008051602061405a83398151915280546001600160a01b0319811690915581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b5034610395576020366003190112610395576121d2612c69565b906001600160a01b038216156121f65760206121ed83612dbe565b54604051908152f35b6322718ad960e21b81526004819052602490fd5b50346103955780600319360112610395576020600954604051908152f35b503461039557602036600319011261039557602061224760043561333f565b6040516001600160a01b039091168152f35b50346103955780600319360112610395576003546040516001600160a01b039091168152602090f35b50346103955761229136612cff565b909161229b613432565b8181036112e55780156112b157611f40811161127557845b8181106122be578580f35b6122c98183876130bb565b356001600160a01b038116919082810361230957600192612303916122ef84888a6130bb565b35918a52603e60205260408a205490613be2565b016122b3565b8780fd5b50346103955780600319360112610395576020600a54604051908152f35b5034610395576020366003190112610395576004358015158091036105385760207f29ba88224264632c83574215c72146e3239d91512d22b3b47194eb28bc26aa3591612376613c44565b60ff196007541660ff821617600755604051908152a180f35b5034610395576020366003190112610395576004358015610ed557338252603e602052604082205480821161247b575b6002546040516323b872dd60e01b81523360048201523060248201526044810184905291906020908390606490829088906001600160a01b03165af191821561151b5761241d9261245e575b506124168382613100565b9033613be2565b338252603e602052604082205460405191825260208201527f73d37b93406c2c9bb4448f85717feabf7c670d1785cc572c98cd312ed3f97f8160403392a280f35b6124769060203d602011610eb457610ea78183612e61565b61240b565b9050806123bf565b50346103955761249236612cff565b9060ff6007959493955416156125bb578185036112e55784156112b15782358452603c60205260408420600801546001600160a01b0316928492839291905b8784106124e557868087878061202b575050f35b909192936124f48589856130bb565b358752603c60205260408720600801546001600160a01b031686900361255057612546600191612540612528888c886130bb565b3561253489878a6130bb565b359033918c5491613902565b906130db565b94019291906124d1565b60405162461bcd60e51b815260206004820152603a60248201527f416c6c20706f736974696f6e73206d75737420757365207468652073616d652060448201527f746f6b656e20666f722062617463682070726f63657373696e670000000000006064820152608490fd5b6333962fd760e01b8452600484fd5b50346103955780600319360112610395576020600654604051908152f35b5034610395576020366003190112610395576004356001600160401b03811161053857612619903690600401612d4f565b906126226134f7565b81156126a057611f40821161127557825490835b838110612641578480f35b807fc6d3da45896ce1bca9d198309a2dbeea3c73a991748f8d88d796ffa06029de93608061267260019488876130cb565b356020612680858a896130cb565b01356040519188835260208301528960408301526060820152a101612636565b60405162461bcd60e51b815260206004820152600b60248201526a456d70747920617272617960a81b6044820152606490fd5b503461039557610c196126e536612c95565b90604051926126f5602085612e61565b85845261310d565b503461039557604036600319011261039557612717612c7f565b336001600160a01b0382160361273357610b9290600435613862565b63334bd91960e11b8252600482fd5b50346103955760203660031901126103955761275c612c69565b612764613432565b6001600160a01b03811680156127cd57600180546001600160a01b031981169092179055604080516001600160a01b0392831681529190921660208201527fce76357c57fa1f65ea8fb41c18f6a9bac76156984fee9e0f25a24b66977bb59d9181908101610ca3565b63c2cf440960e01b8352600483fd5b503461039557604036600319011261039557610b926004356127fc612c7f565b90612809610f118261309a565b6137cb565b503461039557602036600319011261039557610b9261282b612c69565b6128336134a4565b6135b3565b50346103955761284736612cff565b9291612851613432565b8381036112e55780156112b157611f40811161127557845b818110612874578580f35b61287f8186856130bb565b3515612906576128908183866130bb565b358652603c602052604086206005810154611266578054600192916128b68389886130bb565b3590557f5e176ab3e891f654de569024045b7a17e243b1148cd50179f3c73c79edbb96e960406128e784878a6130bb565b35926128f4858b8a6130bb565b3582519182526020820152a201612869565b634dfba02360e01b8652600486fd5b503461039557602036600319011261039557602061293460043561309a565b604051908152f35b503461039557610c1961294e36612c95565b91612f0c565b50346103955780600319360112610395576020600554604051908152f35b5034610395578060031936011261039557602060ff600754166040519015158152f35b50346103955780600319360112610395576020604051620f42408152f35b5034610395576040366003190112610395576129cd612c69565b6024356129d98161333f565b33151580612a9a575b80612a7c575b612a695781906001600160a01b0384811691167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258680a482527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab00793046020526040822080546001600160a01b0319166001600160a01b0390921691909117905580f35b63a9fbf51f60e01b845233600452602484fd5b50612a8681612df7565b338552602052604084205460ff16156129e8565b506001600160a01b0381163314156129e2565b5034610395576020366003190112610395576020612247600435612ad08161333f565b50613370565b5034610395578060031936011261039557604051908060008051602061403a8339815191525490612b0682612ed2565b80855291600181169081156116b05750600114612b2d57610f8f8461163281860382612e61565b60008051602061403a83398151915281526000805160206140fa833981519152939250905b808210612b6b5750909150810160200161163282611622565b919260018160209254838588010152019101909291612b52565b5034610395578060031936011261039557602060405160508152f35b9050346105385760203660031901126105385760043563ffffffff60e01b81168091036113c75760209250637965db0b60e01b8114908115612be5575b5015158152f35b6380ac58cd60e01b811491508115612c17575b8115612c06575b5038612bde565b6301ffc9a760e01b14905038612bff565b635b5e139f60e01b81149150612bf8565b919082519283825260005b848110612c54575050826000602080949584010152601f8019910116010190565b80602080928401015182828601015201612c33565b600435906001600160a01b0382168203610b3a57565b602435906001600160a01b0382168203610b3a57565b6060906003190112610b3a576004356001600160a01b0381168103610b3a57906024356001600160a01b0381168103610b3a579060443590565b9181601f84011215610b3a578235916001600160401b038311610b3a576020808501948460051b010111610b3a57565b6040600319820112610b3a576004356001600160401b038111610b3a5781612d2991600401612ccf565b92909291602435906001600160401b038211610b3a57612d4b91600401612ccf565b9091565b9181601f84011215610b3a578235916001600160401b038311610b3a576020808501948460061b010111610b3a57565b6040906003190112610b3a576004359060243590565b81810292918115918404141715612da857565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b031660009081527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab00793036020526040902090565b6001600160a01b031660009081527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab00793056020526040902090565b604081019081106001600160401b03821117612e4b57604052565b634e487b7160e01b600052604160045260246000fd5b90601f801991011681019081106001600160401b03821117612e4b57604052565b6001600160401b038111612e4b57601f01601f191660200190565b603d54811015612ebc57603d60005260206000209060011b0190600090565b634e487b7160e01b600052603260045260246000fd5b90600182811c92168015612f02575b6020831014612eec57565b634e487b7160e01b600052602260045260246000fd5b91607f1691612ee1565b909291906001600160a01b038416801561308457600094612f2c84613c7a565b9533151580612feb575b509184917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef612f7797989460018060a01b03861698899384612fd957612dbe565b8054600101905584815260008051602061409a8339815191526020526040812080546001600160a01b0319168517905580a4506001600160a01b0316808303612fbf57505050565b6364283d7b60e01b60005260045260245260445260646000fd5b612fe287613ca2565b611f6b88612dbe565b80613034575b15612ffc5738612f36565b84906001600160a01b03881661301e57602491637e27328960e01b8252600452fd5b60449163177e802f60e01b825233600452602452fd5b506001600160a01b03871633148015613067575b80612ff15750336001600160a01b0361306087613370565b1614612ff1565b5061307187612df7565b338252602052604081205460ff16613048565b633250574960e11b600052600060045260246000fd5b60005260008051602061407a83398151915260205260016040600020015490565b9190811015612ebc5760051b0190565b9190811015612ebc5760061b0190565b91908201809211612da857565b90816020910312610b3a57518015158103610b3a5790565b91908203918211612da857565b929161311a818386612f0c565b813b613127575b50505050565b604051630a85bd0160e11b81523360048201526001600160a01b0394851660248201526044810191909152608060648201529216919060209082908190613172906084830190612c28565b03816000865af18091600091613211575b50906131dc57503d156131d5573d61319a81612e82565b906131a86040519283612e61565b81523d6000602083013e5b805190816131d05782633250574960e11b60005260045260246000fd5b602001fd5b60606131b3565b6001600160e01b03191663757a42ff60e11b016131fd575038808080613121565b633250574960e11b60005260045260246000fd5b6020813d60201161324c575b8161322a60209383612e61565b810103126105385751906001600160e01b031982168203610395575038613183565b3d915061321d565b6001600160a01b031680156132b45760008051602061405a83398151915280546001600160a01b0319811683179091556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b631e4fbdf760e01b600052600060045260246000fd5b603d5468010000000000000000811015612e4b5760018101603d556000603d5482101561332b57603d905260011b7fece66cfdbd22e3f37d348a3d8e19074452862cd65fd4b9a11f0336d1ac6d1dc301906020816001925184550151910155565b634e487b7160e01b81526032600452602490fd5b61334881613c7a565b906001600160a01b0382161561335c575090565b637e27328960e01b60005260045260246000fd5b60009081527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab007930460205260409020546001600160a01b031690565b6133b381613c7a565b9060006001600160a01b03831680613414575b82825260008051602061409a8339815191526020526040822080546001600160a01b03191690557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a490565b61341d83613ca2565b61342684612dbe565b821981540190556133c6565b3360009081527f448256db8f8fb95ee3eaaf89c1051414494e85cebb6057fcf996cc3d0ccfb456602052604090205460ff161561346b57565b63e2517d3f60e01b600052336004527f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b92960245260446000fd5b3360009081527fb7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d602052604090205460ff16156134dd57565b63e2517d3f60e01b60005233600452600060245260446000fd5b3360009081527f9cfad5238ce3e0b54cbca0820bf2b02d66d496527d1fa42cb60bdcdd96bd88ab602052604090205460ff161561353057565b63e2517d3f60e01b600052336004527f04824fcb60e7cc526d70b264caa65b62ed44d9c8e5d230e8ff6b0c7373843b8a60245260446000fd5b600081815260008051602061407a8339815191526020908152604080832033845290915290205460ff161561359b5750565b63e2517d3f60e01b6000523360045260245260446000fd5b6001600160a01b03811660009081527f448256db8f8fb95ee3eaaf89c1051414494e85cebb6057fcf996cc3d0ccfb456602052604090205460ff1661366f576001600160a01b031660008181527f448256db8f8fb95ee3eaaf89c1051414494e85cebb6057fcf996cc3d0ccfb45660205260408120805460ff191660011790553391907f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b9299060008051602061401a8339815191529080a4600190565b50600090565b6001600160a01b03811660009081527f9cfad5238ce3e0b54cbca0820bf2b02d66d496527d1fa42cb60bdcdd96bd88ab602052604090205460ff1661366f576001600160a01b031660008181527f9cfad5238ce3e0b54cbca0820bf2b02d66d496527d1fa42cb60bdcdd96bd88ab60205260408120805460ff191660011790553391907f04824fcb60e7cc526d70b264caa65b62ed44d9c8e5d230e8ff6b0c7373843b8a9060008051602061401a8339815191529080a4600190565b6001600160a01b03811660009081527fb7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d602052604090205460ff1661366f576001600160a01b031660008181527fb7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d60205260408120805460ff1916600117905533919060008051602061401a8339815191528180a4600190565b600081815260008051602061407a833981519152602090815260408083206001600160a01b038616845290915290205460ff1661385b57600081815260008051602061407a833981519152602090815260408083206001600160a01b0395909516808452949091528120805460ff191660011790553392919060008051602061401a8339815191529080a4600190565b5050600090565b600081815260008051602061407a833981519152602090815260408083206001600160a01b038616845290915290205460ff161561385b57600081815260008051602061407a833981519152602090815260408083206001600160a01b0395909516808452949091528120805460ff19169055339291907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080a4600190565b919261390d8361333f565b6001600160a01b031633141580613bbd575b80613bb5575b613ba45782600052603c602052600560406000200154613b935782600052603c602052600960406000200154151580613b79575b613b685782600052603c60205260406000209382156119fa576002850190815484116119e95783956000918154808210613af5575b5061399b8582888a613ce0565b91967f2f61af559bf23be05bd7bb2fe5574529caa9a0176cc730cc3dc0d1bd40ec937560206139cc8c600554613100565b80600555604051908152a1898154808214600014613ab757505042600587015560018601859055600081556001600160a01b03613a088c6133aa565b1615613aa25791610160979593917f1291b17e4c611ac722f03763ded81e523d2aa81f5ca80b235aba2fcbe7a0d317999795935b5460078601546006870154600890970154604080519e8f5260208f0193909352918d019490945260608c019790975260808b015260a08a015260c089015260e08801526101008701526101208601526001600160a01b039081166101408601521692a390565b8a637e27328960e01b60005260045260246000fd5b91613aee6101609a989694927f1291b17e4c611ac722f03763ded81e523d2aa81f5ca80b235aba2fcbe7a0d3179c9a989694613100565b8155613a3c565b81613b0d9294939950613b0791613100565b86612d95565b6305f5e10091500495869160078201613b278982546130db565b9055613b62613b368988613100565b6001600160a01b0387166000908152603e60205260409020549099613b5b90826130db565b9087613be2565b3861398e565b6315ff94d360e11b60005260046000fd5b5082600052603c6020526009604060002001544211613959565b63219ce9a360e01b60005260046000fd5b636d8a29e760e11b60005260046000fd5b506001613925565b50613bc78361333f565b50336001600160a01b03613bda85613370565b16141561391f565b7ffdff3ab08a706ff5857d418f1c82588b1b6b61a0ede5fc0c123ae6bd74221d9f9160409160018060a01b03169384600052603e602052808360002055613c3481613c2f84600a54613100565b6130db565b600a5582519182526020820152a2565b60008051602061405a833981519152546001600160a01b03163303613c6557565b63118cdaa760e01b6000523360045260246000fd5b600090815260008051602061409a83398151915260205260409020546001600160a01b031690565b6000527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab007930460205260406000206001600160601b0360a01b8154169055565b919091600052603c60205260406000209182549182811115613f2757613d0f92613d0991613100565b90612d95565b6305f5e1009004928315613f1957613d2b600483015442613100565b93603d5460009560005b828110613ee457505050613d56612710613d4f8784612d95565b0485613f68565b936006613d638684613100565b9401613d708382546130db565b9055846009549181613e7b575b505083151580613e67575b613dd2575b60407f903baec967bd87828705b3a5cfaffa06bd05cf4d6b29bbc0c10318dfa1918de291613dbd846009546130db565b8060095582519182526020820152a193929190565b60025460035460405163a9059cbb60e01b81526001600160a01b03918216600482015260248101879052929160209184916044918391600091165af1908115611945577f903baec967bd87828705b3a5cfaffa06bd05cf4d6b29bbc0c10318dfa1918de292604092613e48575b50915050613d8d565b613e609060203d602011610eb457610ea78183612e61565b5038613e3f565b506003546001600160a01b03161515613d88565b60025460405163a9059cbb60e01b81526001600160a01b039283166004820152602481019390935260209183916044918391600091165af1801561194557613ec5575b8590613d7d565b613edd9060203d602011610eb457610ea78183612e61565b5038613ebe565b6001613eef82612e9d565b500154821015613f02575b600101613d35565b96506001613f0f88612e9d565b5054979050613efa565b600093508392508291508190565b5050505050600090600090600090600090565b60ff6000805160206140ba8339815191525460401c1615613f5757565b631afcd79f60e31b60005260046000fd5b60009160018060a01b038216808452603e60205260408420549283158015614011575b61400957838310613ff257508381613fef9552603e602052806040812055613fb584600a54613100565b9050600a557ffdff3ab08a706ff5857d418f1c82588b1b6b61a0ede5fc0c123ae6bd74221d9f6040805185815260006020820152a2613100565b90565b9183915061400390613fef94613100565b91613be2565b505091505090565b508215613f8b56fe2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab00793009016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930002dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680080bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab0079302f0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0080bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab007930137c58c799b6609234b945e882912ee9ad34948a1dfaa20a97485e1a7752bbf81a2646970667358221220eafdf355b9723b0e6d83fad223740745aee2c566bf28646468ea197beebd7f8964736f6c634300081c0033",
|
2039
|
+
"deployedBytecode": "0x608080604052600436101561001357600080fd5b600090813560e01c90816301ffc9a714612ba15750806303e0ac8614612b8557806306fdde0314612ad6578063081812fc14612aad578063095ea7b3146129b35780630d8317e1146129955780630ead7712146129725780631a39d8ef1461295457806323b872dd1461293c578063248a9ca31461291557806324e3fef71461283857806327ac0c581461280e5780632f2ff15d146127dc5780632f84c3911461274257806336568abe146126fd57806342842e0e146126d35780634796ed04146125e85780634c19386c146125ca578063537b1ec714612483578063572a23351461238f57806358f678691461232b57806359302cbf1461230d5780635c418b791461228257806361d027b3146122595780636352211e146122285780636eac61dd1461220a57806370a08231146121b8578063715018a61461214e57806374de4ec41461208957806375a0b6dd14611fdd5780637949227214611caa57806387173a8e14611c8e57806387c1394314611c6d5780638aee812714611bd35780638da5cb5b14611b9d57806391b7f5ed14611b2657806391d1485414611ad057806394a868a3146116d757806395d89b41146115da57806399fbab8814611543578063a035b1fe14611526578063a0d8d78c146113e7578063a217fddf146113cb578063a22cb4651461132a578063a5d87770146111ad578063b2bad5b21461114d578063b35fb54214611059578063b69e5c7714611020578063b88d4fde14610f93578063c87b56dd14610f38578063cfdbf25414610f1b578063d547741f14610ee4578063d797fe2214610de5578063da29b26514610da6578063e16fd0ec14610d89578063e5a6b10f14610d60578063e985e9c514610d11578063eae86f0b14610cf3578063f00acbaa14610cb8578063f0f4426014610c1c578063f2fde38b14610bef578063f36de22514610bd1578063f5b541a614610b96578063f6a48fac14610b68578063f7c618c114610b3f578063f8c8765e1461053c578063fbc14dda146103985763fc420e6b1461030d57600080fd5b346103955761031b36612d7f565b610323613432565b801561038657818352603c602052604083209060058201546103775781816040927f5e176ab3e891f654de569024045b7a17e243b1148cd50179f3c73c79edbb96e99454925582519182526020820152a280f35b63219ce9a360e01b8452600484fd5b634dfba02360e01b8352600483fd5b80fd5b5034610395576020366003190112610395576004356001600160401b038111610538576103c9903690600401612d4f565b906103d2613432565b603d5483603d55806104aa575b508290815b83831061041357847fdb840036dd546f2fc2b3a5a3807bc68f2b180b4a08b42c51429def8f7be480b68180a180f35b6127106104218486856130cb565b351161049b5760206104348486856130cb565b0135111561048c5761047361044a8385846130cb565b3560206104588587866130cb565b01356040519161046783612e30565b825260208201526132ca565b600160206104828486856130cb565b01359201916103e4565b637616640160e01b8452600484fd5b636093dc5160e01b8552600485fd5b6001600160ff1b038116810361052457603d845260011b7fece66cfdbd22e3f37d348a3d8e19074452862cd65fd4b9a11f0336d1ac6d1dc3017fece66cfdbd22e3f37d348a3d8e19074452862cd65fd4b9a11f0336d1ac6d1dc35b81811061051257506103df565b80856002925585600182015501610505565b634e487b7160e01b84526011600452602484fd5b5080fd5b503461039557608036600319011261039557610556612c69565b61055e612c7f565b6044356001600160a01b03811690819003610b3a57606435906001600160a01b038216808303610b3a576000805160206140ba833981519152549360ff8560401c1615946001600160401b03811680159081610b32575b6001149081610b28575b159081610b1f575b50610b105767ffffffffffffffff1981166001176000805160206140ba8339815191525585610ae3575b5060409586516106018882612e61565b60158152742a3930b234b733ab30bab63a102837b9b4ba34b7b760591b60208201528751906106308983612e61565b6002825261056560f41b6020830152610647613f3a565b61064f613f3a565b8051906001600160401b038211610acf57819061067a60008051602061403a83398151915254612ed2565b601f8111610a4d575b50602090601f83116001146109c2578c926109b7575b50508160011b916000199060031b1c19161760008051602061403a833981519152555b8051906001600160401b0382116109a35781906106e76000805160206140da83398151915254612ed2565b601f8111610928575b50602090601f83116001146108a9578b9261089e575b50508160011b916000199060031b1c1916176000805160206140da833981519152555b610731613f3a565b610739613f3a565b61074285613254565b61074a613f3a565b6001600160a01b031690811561088f576001600160a01b0316918215610880578315610871571561086257906107c19392916001600160601b0360a01b60015416176001556001600160601b0360a01b60025416176002556001600160601b0360a01b60035416176003556305f5e1008555613731565b506107cb336135b3565b506107d533613675565b506107f482516107e481612e30565b61271081528460208201526132ca565b600160ff196007541617600755610809575080f35b60207fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29168ff0000000000000000196000805160206140ba83398151915254166000805160206140ba833981519152555160018152a180f35b630702b3d960e41b8752600487fd5b63cfe2ea6360e01b8852600488fd5b636a27e5f160e01b8852600488fd5b63c2cf440960e01b8852600488fd5b015190503880610706565b6000805160206140da8339815191528c52818c209250601f1984168c5b81811061091057509084600195949392106108f7575b505050811b016000805160206140da83398151915255610729565b015160001960f88460031b161c191690553880806108dc565b929360206001819287860151815501950193016108c6565b6000805160206140da8339815191528c529091507ff4bad0a69248f59680a4f2b3000328cec71a413447c96781cfe5996daa8c456e601f840160051c81019160208510610999575b90601f859493920160051c01905b81811061098b57506106f0565b8c815584935060010161097e565b9091508190610970565b634e487b7160e01b8a52604160045260248afd5b015190503880610699565b60008051602061403a8339815191528d526000805160206140fa8339815191529250601f1984168d5b818110610a355750908460019594939210610a1c575b505050811b0160008051602061403a833981519152556106bc565b015160001960f88460031b161c19169055388080610a01565b929360206001819287860151815501950193016109eb565b90915060008051602061403a8339815191528c52601f830160051c6000805160206140fa833981519152019060208410610ab9575b90601f8493920160051c6000805160206140fa83398151915201905b818110610aab5750610683565b8d8155849350600101610a9e565b6000805160206140fa8339815191529150610a82565b634e487b7160e01b8b52604160045260248bfd5b68ffffffffffffffffff191668010000000000000001176000805160206140ba83398151915255386105f1565b63f92ee8a960e01b8852600488fd5b905015386105c7565b303b1591506105bf565b8791506105b5565b600080fd5b50346103955780600319360112610395576002546040516001600160a01b039091168152602090f35b503461039557602036600319011261039557610b92610b85612c69565b610b8d6134a4565b613675565b5080f35b503461039557806003193601126103955760206040517f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b9298152f35b50346103955780600319360112610395576020603d54604051908152f35b503461039557602036600319011261039557610c19610c0c612c69565b610c14613c44565b613254565b80f35b503461039557602036600319011261039557610c36612c69565b610c3e613c44565b6001600160a01b0381168015610ca957600380546001600160a01b031981169092179055604080516001600160a01b0392831681529190921660208201527f4ab5be82436d353e61ca18726e984e561f5c1cc7c6d38b29d2553c790434705a91819081015b0390a180f35b63cfe2ea6360e01b8352600483fd5b503461039557806003193601126103955760206040517f04824fcb60e7cc526d70b264caa65b62ed44d9c8e5d230e8ff6b0c7373843b8a8152f35b50346103955780600319360112610395576020600854604051908152f35b503461039557604036600319011261039557610d2b612c69565b610d3c610d36612c7f565b91612df7565b9060018060a01b0316600052602052602060ff604060002054166040519015158152f35b50346103955780600319360112610395576001546040516001600160a01b039091168152602090f35b503461039557806003193601126103955760206040516127108152f35b50346103955760203660031901126103955760043590603d54821015610395576040610dd183612e9d565b506001815491015482519182526020820152f35b5034610395576020366003190112610395576004358015610ed5576006548111610ec6576001546040516323b872dd60e01b815233600482015230602482015260448101839052906020908290606490829087906001600160a01b03165af18015610ebb57610e8e575b50610e5c81600654613100565b6006556040519081527f1ddc8f26f8c3c076f9978db18d22e7b427b1a630289eda0ff2e784501db7225360203392a280f35b610eaf9060203d602011610eb4575b610ea78183612e61565b8101906130e8565b610e4f565b503d610e9d565b6040513d85823e3d90fd5b63e480bdff60e01b8252600482fd5b631f2a200560e01b8252600482fd5b503461039557604036600319011261039557610b92600435610f04612c7f565b90610f16610f118261309a565b613569565b613862565b50346103955780600319360112610395576020604051611f408152f35b503461039557602036600319011261039557610f5560043561333f565b5060209080604051610f678482612e61565b525060405190610f778183612e61565b60008252610f8f604051928284938452830190612c28565b0390f35b503461039557608036600319011261039557610fad612c69565b610fb5612c7f565b90606435906001600160401b03821161101c573660238301121561101c5781600401359284610fe385612e82565b93610ff16040519586612e61565b85855236602487830101116105385785610c199660246020930183880137850101526044359161310d565b8380fd5b5034610395576020366003190112610395576020906040906001600160a01b03611048612c69565b168152603e83522054604051908152f35b503461039557604036600319011261039557611073612c69565b60243561107e613c44565b6001546001600160a01b03928316921682148015611139575b61112a57801561111b5760405163a9059cbb60e01b81523360048201526024810191909152906020908290604490829086905af19081156111105782916110f1575b50156110e25780f35b63360e42e160e01b8152600490fd5b61110a915060203d602011610eb457610ea78183612e61565b386110d9565b6040513d84823e3d90fd5b631f2a200560e01b8352600483fd5b63e3542bf760e01b8352600483fd5b506002546001600160a01b03168214611097565b50346103955761115c36612d7f565b611164613432565b818352603c60205260408320600581015461037757817f4543fdb253b6e350e8c47f75076648def2738cf8ad1c799f5bc933a07dfb2a0d9260096020930155604051908152a280f35b5034610395576111bc36612cff565b92916111c6613432565b8381036112e55780156112b157611f40811161127557845b8181106111e9578580f35b6111f48183866130bb565b358652603c6020526040862060058101546112665790600191600961121a8389886130bb565b359101556112298184876130bb565b357f4543fdb253b6e350e8c47f75076648def2738cf8ad1c799f5bc933a07dfb2a0d6020611258848a896130bb565b35604051908152a2016111de565b63219ce9a360e01b8752600487fd5b60405162461bcd60e51b815260206004820152601460248201527342617463682073697a6520746f6f206c6172676560601b6044820152606490fd5b60405162461bcd60e51b815260206004820152600c60248201526b456d7074792061727261797360a01b6044820152606490fd5b60405162461bcd60e51b815260206004820152601860248201527f4172726179206c656e67746873206d757374206d6174636800000000000000006044820152606490fd5b503461039557604036600319011261039557611344612c69565b602435908115158092036113c7576001600160a01b03169081156113b35761136b33612df7565b82600052602052604060002060ff1981541660ff83161790556040519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a380f35b630b61174360e31b83526004829052602483fd5b8280fd5b5034610395578060031936011261039557602090604051908152f35b503461039557602036600319011261039557600435611404613c44565b8015610ed5576001546040516370a0823160e01b81523060048201526001600160a01b0390911690602081602481855afa90811561151b5784916114e9575b5082116114da5760405163a9059cbb60e01b815233600482015260248101839052906020908290604490829087905af18015610ebb576114bd575b5061148b816006546130db565b6006556040519081527f2c2d88bb2c04a245a8df31f649252cce1de7bf7ac17d3555f3b7530f968f8d0660203392a280f35b6114d59060203d602011610eb457610ea78183612e61565b61147e565b631e9acf1760e31b8352600483fd5b90506020813d602011611513575b8161150460209383612e61565b8101031261101c575138611443565b3d91506114f7565b6040513d86823e3d90fd5b503461039557806003193601126103955760209054604051908152f35b5034610395576020366003190112610395576040610140916004358152603c60205220805490600181015490600281015460038201546004830154600584015490600685015492600786015494600960018060a01b0360088901541697015497604051998a5260208a015260408901526060880152608087015260a086015260c085015260e0840152610100830152610120820152f35b503461039557806003193601126103955760405190806000805160206140da833981519152549061160a82612ed2565b80855291600181169081156116b05750600114611646575b610f8f8461163281860382612e61565b604051918291602083526020830190612c28565b6000805160206140da83398151915281527ff4bad0a69248f59680a4f2b3000328cec71a413447c96781cfe5996daa8c456e939250905b8082106116965750909150810160200161163282611622565b91926001816020925483858801015201910190929161167d565b60ff191660208087019190915292151560051b850190920192506116329150839050611622565b5034610395576116e636612d7f565b6116f1929192613432565b828252603c602052604082209260098401548015908115611ac5575b50611ab6576005840154611aa7578115611a99578254605081028115828204605014811715611a8557609683029283046096141715611a7157606490048310908115611a64575b50611a55576117628161333f565b92600260018060a01b036008870154169501549061177f8361333f565b6001600160a01b031633141580611a30575b80611a29575b611a1a57828152603c6020526005604082200154611a0b575081600052603c60205260406000209281156119fa576002840190815483116119e95782946000918154808210611976575b506117ee88828789613ce0565b91967f2f61af559bf23be05bd7bb2fe5574529caa9a0176cc730cc3dc0d1bd40ec9375602061181f8b600554613100565b80600555604051908152a180548980820361196657505042600587015560018601859055600081556001600160a01b036118588b6133aa565b1615611951575b5496600786015493600687015496600860018060a01b0391015416986040519a8b5260208b015260408a01526060890152608088015260a087015260c086015260e08501526101008401526101208301526101408201527f1291b17e4c611ac722f03763ded81e523d2aa81f5ca80b235aba2fcbe7a0d31761016060018060a01b03861692a3806118ec57005b60405163a9059cbb60e01b81526001600160a01b03929092166004830152602482015290602090829060449082906000905af180156119455761192b57005b6119439060203d602011610eb457610ea78183612e61565b005b6040513d6000823e3d90fd5b89637e27328960e01b60005260045260246000fd5b61196f91613100565b815561185f565b8161198e929493985061198891613100565b85612d95565b6305f5e100915004948591600782016119a88882546130db565b90556119e36119b78887613100565b6001600160a01b038a166000908152603e602052604090205490986119dc90826130db565b908a613be2565b386117e1565b631e9acf1760e31b60005260046000fd5b631f2a200560e01b60005260046000fd5b63219ce9a360e01b8152600490fd5b636d8a29e760e11b8152600490fd5b5080611797565b50611a3a8361333f565b50336001600160a01b03611a4d85613370565b161415611791565b630df22a0f60e21b8352600483fd5b6064915004821138611754565b634e487b7160e01b85526011600452602485fd5b634e487b7160e01b86526011600452602486fd5b62bfc92160e01b8352600483fd5b63219ce9a360e01b8352600483fd5b6309f7a15560e11b8352600483fd5b90504211153861170d565b50346103955760403660031901126103955760ff6040602092611af1612c7f565b600435825260008051602061407a83398151915285528282206001600160a01b03909116825284522054604051911615158152f35b503461039557602036600319011261039557600435611b436134f7565b8015611b8e5760807fc6d3da45896ce1bca9d198309a2dbeea3c73a991748f8d88d796ffa06029de93918354908085556040519182526020820152836040820152426060820152a180f35b634dfba02360e01b8252600482fd5b503461039557806003193601126103955760008051602061405a833981519152546040516001600160a01b039091168152602090f35b503461039557602036600319011261039557611bed612c69565b611bf5613432565b6001600160a01b0381168015611c5e57600280546001600160a01b031981169092179055604080516001600160a01b0392831681529190921660208201527f906ff2422a6ffa134f2d7ccaffd446bc0c583a5cb6615749b4b2836942a5fea89181908101610ca3565b636a27e5f160e01b8352600483fd5b50346103955780600319360112610395575060206305f5e100604051908152f35b5034610395578060031936011261039557602060405160968152f35b503461039557606036600319011261039557600435611cc7612c7f565b90604435918115611fce576001600160a01b038116611fc8575033905b6001546040516323b872dd60e01b815233600482015230602482015260448101839052906020908290606490829089906001600160a01b03165af18015611fbd57611fa0575b50600454926000198414611a715760018401600455845460018060a01b03600154166040519161014083018381106001600160401b03821117611f8c57918491600993604052845283888a60208301818152604084018a815260608501908b82526080860192428452604060a088019580875260c089019781895261012060e08b019a838c5261010081019c8d52019b8c528152603c602052209a518b555160018b01555160028a015551600389015551600488015551600587015551600686015551600785015560018060a01b03905116600884019060018060a01b03166001600160601b0360a01b825416179055519101557f2f61af559bf23be05bd7bb2fe5574529caa9a0176cc730cc3dc0d1bd40ec93756020611e4d846005546130db565b80600555604051908152a16001600160a01b038316928315611f7857611e7285613c7a565b6001600160a01b0381168015159287918791611e929086611f5957612dbe565b80546001019055828a5260008051602061409a83398151915260205260408a2080546001600160a01b031916831790557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8a80a450611f455760a08493927ff5097c6b4689824558e56b486a27d0a598420ba3453bb2988e15785271d06725926020975491600180851b0360015416906040519384528984015242604084015260608301526080820152a3604051908152f35b6339e3563760e11b85526004859052602485fd5b611f6285613ca2565b611f6b86612dbe565b8054600019019055612dbe565b633250574960e11b86526004869052602486fd5b634e487b7160e01b89526041600452602489fd5b611fb89060203d602011610eb457610ea78183612e61565b611d2a565b6040513d87823e3d90fd5b90611ce4565b631f2a200560e01b8452600484fd5b503461039557611fec36612d7f565b60ff600793929354161561207a576120228383948452603c60205260018060a01b03600860408620015416928454903392613902565b8061202b575050f35b60405163a9059cbb60e01b815233600482015260248101919091529160209183916044918391905af1801561111057612062575080f35b610b929060203d602011610eb457610ea78183612e61565b6333962fd760e01b8252600482fd5b5034610395576020366003190112610395576004358015610ed5576002546040516323b872dd60e01b81523360048201523060248201526044810183905291906020908390606490829087906001600160a01b03165af1908115610ebb577fc04c302bacaef8c9bec8841c7f0dffba5a121e12e14b6a52f9fc9940ecf0d7aa92604092612131575b5061211f60085491826130db565b8060085582519182526020820152a180f35b6121499060203d602011610eb457610ea78183612e61565b612111565b5034610395578060031936011261039557612167613c44565b60008051602061405a83398151915280546001600160a01b0319811690915581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b5034610395576020366003190112610395576121d2612c69565b906001600160a01b038216156121f65760206121ed83612dbe565b54604051908152f35b6322718ad960e21b81526004819052602490fd5b50346103955780600319360112610395576020600954604051908152f35b503461039557602036600319011261039557602061224760043561333f565b6040516001600160a01b039091168152f35b50346103955780600319360112610395576003546040516001600160a01b039091168152602090f35b50346103955761229136612cff565b909161229b613432565b8181036112e55780156112b157611f40811161127557845b8181106122be578580f35b6122c98183876130bb565b356001600160a01b038116919082810361230957600192612303916122ef84888a6130bb565b35918a52603e60205260408a205490613be2565b016122b3565b8780fd5b50346103955780600319360112610395576020600a54604051908152f35b5034610395576020366003190112610395576004358015158091036105385760207f29ba88224264632c83574215c72146e3239d91512d22b3b47194eb28bc26aa3591612376613c44565b60ff196007541660ff821617600755604051908152a180f35b5034610395576020366003190112610395576004358015610ed557338252603e602052604082205480821161247b575b6002546040516323b872dd60e01b81523360048201523060248201526044810184905291906020908390606490829088906001600160a01b03165af191821561151b5761241d9261245e575b506124168382613100565b9033613be2565b338252603e602052604082205460405191825260208201527f73d37b93406c2c9bb4448f85717feabf7c670d1785cc572c98cd312ed3f97f8160403392a280f35b6124769060203d602011610eb457610ea78183612e61565b61240b565b9050806123bf565b50346103955761249236612cff565b9060ff6007959493955416156125bb578185036112e55784156112b15782358452603c60205260408420600801546001600160a01b0316928492839291905b8784106124e557868087878061202b575050f35b909192936124f48589856130bb565b358752603c60205260408720600801546001600160a01b031686900361255057612546600191612540612528888c886130bb565b3561253489878a6130bb565b359033918c5491613902565b906130db565b94019291906124d1565b60405162461bcd60e51b815260206004820152603a60248201527f416c6c20706f736974696f6e73206d75737420757365207468652073616d652060448201527f746f6b656e20666f722062617463682070726f63657373696e670000000000006064820152608490fd5b6333962fd760e01b8452600484fd5b50346103955780600319360112610395576020600654604051908152f35b5034610395576020366003190112610395576004356001600160401b03811161053857612619903690600401612d4f565b906126226134f7565b81156126a057611f40821161127557825490835b838110612641578480f35b807fc6d3da45896ce1bca9d198309a2dbeea3c73a991748f8d88d796ffa06029de93608061267260019488876130cb565b356020612680858a896130cb565b01356040519188835260208301528960408301526060820152a101612636565b60405162461bcd60e51b815260206004820152600b60248201526a456d70747920617272617960a81b6044820152606490fd5b503461039557610c196126e536612c95565b90604051926126f5602085612e61565b85845261310d565b503461039557604036600319011261039557612717612c7f565b336001600160a01b0382160361273357610b9290600435613862565b63334bd91960e11b8252600482fd5b50346103955760203660031901126103955761275c612c69565b612764613432565b6001600160a01b03811680156127cd57600180546001600160a01b031981169092179055604080516001600160a01b0392831681529190921660208201527fce76357c57fa1f65ea8fb41c18f6a9bac76156984fee9e0f25a24b66977bb59d9181908101610ca3565b63c2cf440960e01b8352600483fd5b503461039557604036600319011261039557610b926004356127fc612c7f565b90612809610f118261309a565b6137cb565b503461039557602036600319011261039557610b9261282b612c69565b6128336134a4565b6135b3565b50346103955761284736612cff565b9291612851613432565b8381036112e55780156112b157611f40811161127557845b818110612874578580f35b61287f8186856130bb565b3515612906576128908183866130bb565b358652603c602052604086206005810154611266578054600192916128b68389886130bb565b3590557f5e176ab3e891f654de569024045b7a17e243b1148cd50179f3c73c79edbb96e960406128e784878a6130bb565b35926128f4858b8a6130bb565b3582519182526020820152a201612869565b634dfba02360e01b8652600486fd5b503461039557602036600319011261039557602061293460043561309a565b604051908152f35b503461039557610c1961294e36612c95565b91612f0c565b50346103955780600319360112610395576020600554604051908152f35b5034610395578060031936011261039557602060ff600754166040519015158152f35b50346103955780600319360112610395576020604051620f42408152f35b5034610395576040366003190112610395576129cd612c69565b6024356129d98161333f565b33151580612a9a575b80612a7c575b612a695781906001600160a01b0384811691167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258680a482527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab00793046020526040822080546001600160a01b0319166001600160a01b0390921691909117905580f35b63a9fbf51f60e01b845233600452602484fd5b50612a8681612df7565b338552602052604084205460ff16156129e8565b506001600160a01b0381163314156129e2565b5034610395576020366003190112610395576020612247600435612ad08161333f565b50613370565b5034610395578060031936011261039557604051908060008051602061403a8339815191525490612b0682612ed2565b80855291600181169081156116b05750600114612b2d57610f8f8461163281860382612e61565b60008051602061403a83398151915281526000805160206140fa833981519152939250905b808210612b6b5750909150810160200161163282611622565b919260018160209254838588010152019101909291612b52565b5034610395578060031936011261039557602060405160508152f35b9050346105385760203660031901126105385760043563ffffffff60e01b81168091036113c75760209250637965db0b60e01b8114908115612be5575b5015158152f35b6380ac58cd60e01b811491508115612c17575b8115612c06575b5038612bde565b6301ffc9a760e01b14905038612bff565b635b5e139f60e01b81149150612bf8565b919082519283825260005b848110612c54575050826000602080949584010152601f8019910116010190565b80602080928401015182828601015201612c33565b600435906001600160a01b0382168203610b3a57565b602435906001600160a01b0382168203610b3a57565b6060906003190112610b3a576004356001600160a01b0381168103610b3a57906024356001600160a01b0381168103610b3a579060443590565b9181601f84011215610b3a578235916001600160401b038311610b3a576020808501948460051b010111610b3a57565b6040600319820112610b3a576004356001600160401b038111610b3a5781612d2991600401612ccf565b92909291602435906001600160401b038211610b3a57612d4b91600401612ccf565b9091565b9181601f84011215610b3a578235916001600160401b038311610b3a576020808501948460061b010111610b3a57565b6040906003190112610b3a576004359060243590565b81810292918115918404141715612da857565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b031660009081527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab00793036020526040902090565b6001600160a01b031660009081527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab00793056020526040902090565b604081019081106001600160401b03821117612e4b57604052565b634e487b7160e01b600052604160045260246000fd5b90601f801991011681019081106001600160401b03821117612e4b57604052565b6001600160401b038111612e4b57601f01601f191660200190565b603d54811015612ebc57603d60005260206000209060011b0190600090565b634e487b7160e01b600052603260045260246000fd5b90600182811c92168015612f02575b6020831014612eec57565b634e487b7160e01b600052602260045260246000fd5b91607f1691612ee1565b909291906001600160a01b038416801561308457600094612f2c84613c7a565b9533151580612feb575b509184917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef612f7797989460018060a01b03861698899384612fd957612dbe565b8054600101905584815260008051602061409a8339815191526020526040812080546001600160a01b0319168517905580a4506001600160a01b0316808303612fbf57505050565b6364283d7b60e01b60005260045260245260445260646000fd5b612fe287613ca2565b611f6b88612dbe565b80613034575b15612ffc5738612f36565b84906001600160a01b03881661301e57602491637e27328960e01b8252600452fd5b60449163177e802f60e01b825233600452602452fd5b506001600160a01b03871633148015613067575b80612ff15750336001600160a01b0361306087613370565b1614612ff1565b5061307187612df7565b338252602052604081205460ff16613048565b633250574960e11b600052600060045260246000fd5b60005260008051602061407a83398151915260205260016040600020015490565b9190811015612ebc5760051b0190565b9190811015612ebc5760061b0190565b91908201809211612da857565b90816020910312610b3a57518015158103610b3a5790565b91908203918211612da857565b929161311a818386612f0c565b813b613127575b50505050565b604051630a85bd0160e11b81523360048201526001600160a01b0394851660248201526044810191909152608060648201529216919060209082908190613172906084830190612c28565b03816000865af18091600091613211575b50906131dc57503d156131d5573d61319a81612e82565b906131a86040519283612e61565b81523d6000602083013e5b805190816131d05782633250574960e11b60005260045260246000fd5b602001fd5b60606131b3565b6001600160e01b03191663757a42ff60e11b016131fd575038808080613121565b633250574960e11b60005260045260246000fd5b6020813d60201161324c575b8161322a60209383612e61565b810103126105385751906001600160e01b031982168203610395575038613183565b3d915061321d565b6001600160a01b031680156132b45760008051602061405a83398151915280546001600160a01b0319811683179091556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b631e4fbdf760e01b600052600060045260246000fd5b603d5468010000000000000000811015612e4b5760018101603d556000603d5482101561332b57603d905260011b7fece66cfdbd22e3f37d348a3d8e19074452862cd65fd4b9a11f0336d1ac6d1dc301906020816001925184550151910155565b634e487b7160e01b81526032600452602490fd5b61334881613c7a565b906001600160a01b0382161561335c575090565b637e27328960e01b60005260045260246000fd5b60009081527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab007930460205260409020546001600160a01b031690565b6133b381613c7a565b9060006001600160a01b03831680613414575b82825260008051602061409a8339815191526020526040822080546001600160a01b03191690557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a490565b61341d83613ca2565b61342684612dbe565b821981540190556133c6565b3360009081527f448256db8f8fb95ee3eaaf89c1051414494e85cebb6057fcf996cc3d0ccfb456602052604090205460ff161561346b57565b63e2517d3f60e01b600052336004527f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b92960245260446000fd5b3360009081527fb7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d602052604090205460ff16156134dd57565b63e2517d3f60e01b60005233600452600060245260446000fd5b3360009081527f9cfad5238ce3e0b54cbca0820bf2b02d66d496527d1fa42cb60bdcdd96bd88ab602052604090205460ff161561353057565b63e2517d3f60e01b600052336004527f04824fcb60e7cc526d70b264caa65b62ed44d9c8e5d230e8ff6b0c7373843b8a60245260446000fd5b600081815260008051602061407a8339815191526020908152604080832033845290915290205460ff161561359b5750565b63e2517d3f60e01b6000523360045260245260446000fd5b6001600160a01b03811660009081527f448256db8f8fb95ee3eaaf89c1051414494e85cebb6057fcf996cc3d0ccfb456602052604090205460ff1661366f576001600160a01b031660008181527f448256db8f8fb95ee3eaaf89c1051414494e85cebb6057fcf996cc3d0ccfb45660205260408120805460ff191660011790553391907f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b9299060008051602061401a8339815191529080a4600190565b50600090565b6001600160a01b03811660009081527f9cfad5238ce3e0b54cbca0820bf2b02d66d496527d1fa42cb60bdcdd96bd88ab602052604090205460ff1661366f576001600160a01b031660008181527f9cfad5238ce3e0b54cbca0820bf2b02d66d496527d1fa42cb60bdcdd96bd88ab60205260408120805460ff191660011790553391907f04824fcb60e7cc526d70b264caa65b62ed44d9c8e5d230e8ff6b0c7373843b8a9060008051602061401a8339815191529080a4600190565b6001600160a01b03811660009081527fb7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d602052604090205460ff1661366f576001600160a01b031660008181527fb7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d60205260408120805460ff1916600117905533919060008051602061401a8339815191528180a4600190565b600081815260008051602061407a833981519152602090815260408083206001600160a01b038616845290915290205460ff1661385b57600081815260008051602061407a833981519152602090815260408083206001600160a01b0395909516808452949091528120805460ff191660011790553392919060008051602061401a8339815191529080a4600190565b5050600090565b600081815260008051602061407a833981519152602090815260408083206001600160a01b038616845290915290205460ff161561385b57600081815260008051602061407a833981519152602090815260408083206001600160a01b0395909516808452949091528120805460ff19169055339291907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080a4600190565b919261390d8361333f565b6001600160a01b031633141580613bbd575b80613bb5575b613ba45782600052603c602052600560406000200154613b935782600052603c602052600960406000200154151580613b79575b613b685782600052603c60205260406000209382156119fa576002850190815484116119e95783956000918154808210613af5575b5061399b8582888a613ce0565b91967f2f61af559bf23be05bd7bb2fe5574529caa9a0176cc730cc3dc0d1bd40ec937560206139cc8c600554613100565b80600555604051908152a1898154808214600014613ab757505042600587015560018601859055600081556001600160a01b03613a088c6133aa565b1615613aa25791610160979593917f1291b17e4c611ac722f03763ded81e523d2aa81f5ca80b235aba2fcbe7a0d317999795935b5460078601546006870154600890970154604080519e8f5260208f0193909352918d019490945260608c019790975260808b015260a08a015260c089015260e08801526101008701526101208601526001600160a01b039081166101408601521692a390565b8a637e27328960e01b60005260045260246000fd5b91613aee6101609a989694927f1291b17e4c611ac722f03763ded81e523d2aa81f5ca80b235aba2fcbe7a0d3179c9a989694613100565b8155613a3c565b81613b0d9294939950613b0791613100565b86612d95565b6305f5e10091500495869160078201613b278982546130db565b9055613b62613b368988613100565b6001600160a01b0387166000908152603e60205260409020549099613b5b90826130db565b9087613be2565b3861398e565b6315ff94d360e11b60005260046000fd5b5082600052603c6020526009604060002001544211613959565b63219ce9a360e01b60005260046000fd5b636d8a29e760e11b60005260046000fd5b506001613925565b50613bc78361333f565b50336001600160a01b03613bda85613370565b16141561391f565b7ffdff3ab08a706ff5857d418f1c82588b1b6b61a0ede5fc0c123ae6bd74221d9f9160409160018060a01b03169384600052603e602052808360002055613c3481613c2f84600a54613100565b6130db565b600a5582519182526020820152a2565b60008051602061405a833981519152546001600160a01b03163303613c6557565b63118cdaa760e01b6000523360045260246000fd5b600090815260008051602061409a83398151915260205260409020546001600160a01b031690565b6000527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab007930460205260406000206001600160601b0360a01b8154169055565b919091600052603c60205260406000209182549182811115613f2757613d0f92613d0991613100565b90612d95565b6305f5e1009004928315613f1957613d2b600483015442613100565b93603d5460009560005b828110613ee457505050613d56612710613d4f8784612d95565b0485613f68565b936006613d638684613100565b9401613d708382546130db565b9055846009549181613e7b575b505083151580613e67575b613dd2575b60407f903baec967bd87828705b3a5cfaffa06bd05cf4d6b29bbc0c10318dfa1918de291613dbd846009546130db565b8060095582519182526020820152a193929190565b60025460035460405163a9059cbb60e01b81526001600160a01b03918216600482015260248101879052929160209184916044918391600091165af1908115611945577f903baec967bd87828705b3a5cfaffa06bd05cf4d6b29bbc0c10318dfa1918de292604092613e48575b50915050613d8d565b613e609060203d602011610eb457610ea78183612e61565b5038613e3f565b506003546001600160a01b03161515613d88565b60025460405163a9059cbb60e01b81526001600160a01b039283166004820152602481019390935260209183916044918391600091165af1801561194557613ec5575b8590613d7d565b613edd9060203d602011610eb457610ea78183612e61565b5038613ebe565b6001613eef82612e9d565b500154821015613f02575b600101613d35565b96506001613f0f88612e9d565b5054979050613efa565b600093508392508291508190565b5050505050600090600090600090600090565b60ff6000805160206140ba8339815191525460401c1615613f5757565b631afcd79f60e31b60005260046000fd5b60009160018060a01b038216808452603e60205260408420549283158015614011575b61400957838310613ff257508381613fef9552603e602052806040812055613fb584600a54613100565b9050600a557ffdff3ab08a706ff5857d418f1c82588b1b6b61a0ede5fc0c123ae6bd74221d9f6040805185815260006020820152a2613100565b90565b9183915061400390613fef94613100565b91613be2565b505091505090565b508215613f8b56fe2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab00793009016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930002dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680080bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab0079302f0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0080bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab007930137c58c799b6609234b945e882912ee9ad34948a1dfaa20a97485e1a7752bbf81a2646970667358221220eafdf355b9723b0e6d83fad223740745aee2c566bf28646468ea197beebd7f8964736f6c634300081c0033",
|
1927
2040
|
"linkReferences": {},
|
1928
2041
|
"deployedLinkReferences": {}
|
1929
2042
|
}
|
@@ -19,8 +19,8 @@ export declare namespace TradingVault {
|
|
19
19
|
};
|
20
20
|
}
|
21
21
|
export interface TradingVaultInterface extends Interface {
|
22
|
-
getFunction(nameOrSignature: "BASE_WEIGHT" | "DEFAULT_ADMIN_ROLE" | "EXPO" | "MAX_BATCH_SIZE" | "MAX_PRICE_PERCENTAGE" | "MIN_PRICE_PERCENTAGE" | "OPERATOR_ROLE" | "PERCENTAGE_BASE" | "PRICE_SETTER_ROLE" | "addReward" | "approve" | "balanceOf" | "batchEmitPriceUpdated" | "batchSetPositionExpiration" | "batchUpdateEntryPrice" | "borrowCurrency" | "claimERC20" | "closeExpiredPosition" | "createPosition" | "currency" | "getApproved" | "getRewardConfigsLength" | "getRoleAdmin" | "grantOperatorRole" | "grantPriceSetterRole" | "grantRole" | "hasRole" | "initialize" | "isApprovedForAll" | "isReduceEnabled" | "name" | "owner" | "ownerOf" | "positions" | "price" | "reducePosition" | "reducePositions" | "renounceOwnership" | "renounceRole" | "repayCurrency" | "revokeRole" | "rewardConfigs" | "rewardToken" | "safeTransferFrom(address,address,uint256)" | "safeTransferFrom(address,address,uint256,bytes)" | "setApprovalForAll" | "setCurrency" | "setPositionExpiration" | "setPrice" | "setReduceEnabled" | "setRewardToken" | "setTreasury" | "supportsInterface" | "symbol" | "tokenURI" | "totalAmount" | "totalBorrowed" | "totalRewardsAdded" | "totalRewardsHarvested" | "transferFrom" | "transferOwnership" | "treasury" | "updateEntryPrice" | "updateRewardConfigs"): FunctionFragment;
|
23
|
-
getEvent(nameOrSignatureOrTopic: "Approval" | "ApprovalForAll" | "CurrencyBorrowed" | "CurrencyRepaid" | "CurrencyUpdated" | "EntryPriceUpdated" | "Initialized" | "OwnershipTransferred" | "PositionCreated" | "PositionExpirationUpdated" | "PositionReduced" | "PriceUpdated" | "ReduceEnabledUpdated" | "RewardConfigsUpdated" | "RewardTokenUpdated" | "RoleAdminChanged" | "RoleGranted" | "RoleRevoked" | "TotalAmountUpdated" | "TotalRewardsHarvestedUpdated" | "TotalRewardsUpdated" | "Transfer" | "TreasuryUpdated"): EventFragment;
|
22
|
+
getFunction(nameOrSignature: "BASE_WEIGHT" | "DEFAULT_ADMIN_ROLE" | "EXPO" | "MAX_BATCH_SIZE" | "MAX_PRICE_PERCENTAGE" | "MIN_PRICE_PERCENTAGE" | "OPERATOR_ROLE" | "PERCENTAGE_BASE" | "PRICE_SETTER_ROLE" | "addReward" | "approve" | "balanceOf" | "batchEmitPriceUpdated" | "batchSetPositionExpiration" | "batchUpdateEntryPrice" | "batchUpdateUserDebt" | "borrowCurrency" | "claimERC20" | "closeExpiredPosition" | "createPosition" | "currency" | "getApproved" | "getRewardConfigsLength" | "getRoleAdmin" | "grantOperatorRole" | "grantPriceSetterRole" | "grantRole" | "hasRole" | "initialize" | "isApprovedForAll" | "isReduceEnabled" | "name" | "owner" | "ownerOf" | "positions" | "price" | "reducePosition" | "reducePositions" | "renounceOwnership" | "renounceRole" | "repayCurrency" | "repayUserDebt" | "revokeRole" | "rewardConfigs" | "rewardToken" | "safeTransferFrom(address,address,uint256)" | "safeTransferFrom(address,address,uint256,bytes)" | "setApprovalForAll" | "setCurrency" | "setPositionExpiration" | "setPrice" | "setReduceEnabled" | "setRewardToken" | "setTreasury" | "supportsInterface" | "symbol" | "tokenURI" | "totalAmount" | "totalBorrowed" | "totalRewardsAdded" | "totalRewardsHarvested" | "totalUserDebt" | "transferFrom" | "transferOwnership" | "treasury" | "updateEntryPrice" | "updateRewardConfigs" | "userDebt"): FunctionFragment;
|
23
|
+
getEvent(nameOrSignatureOrTopic: "Approval" | "ApprovalForAll" | "CurrencyBorrowed" | "CurrencyRepaid" | "CurrencyUpdated" | "EntryPriceUpdated" | "Initialized" | "OwnershipTransferred" | "PositionCreated" | "PositionExpirationUpdated" | "PositionReduced" | "PriceUpdated" | "ReduceEnabledUpdated" | "RewardConfigsUpdated" | "RewardTokenUpdated" | "RoleAdminChanged" | "RoleGranted" | "RoleRevoked" | "TotalAmountUpdated" | "TotalRewardsHarvestedUpdated" | "TotalRewardsUpdated" | "Transfer" | "TreasuryUpdated" | "UserDebtRepaid" | "UserDebtUpdated"): EventFragment;
|
24
24
|
encodeFunctionData(functionFragment: "BASE_WEIGHT", values?: undefined): string;
|
25
25
|
encodeFunctionData(functionFragment: "DEFAULT_ADMIN_ROLE", values?: undefined): string;
|
26
26
|
encodeFunctionData(functionFragment: "EXPO", values?: undefined): string;
|
@@ -36,6 +36,7 @@ export interface TradingVaultInterface extends Interface {
|
|
36
36
|
encodeFunctionData(functionFragment: "batchEmitPriceUpdated", values: [TradingVault.PriceDataStruct[]]): string;
|
37
37
|
encodeFunctionData(functionFragment: "batchSetPositionExpiration", values: [BigNumberish[], BigNumberish[]]): string;
|
38
38
|
encodeFunctionData(functionFragment: "batchUpdateEntryPrice", values: [BigNumberish[], BigNumberish[]]): string;
|
39
|
+
encodeFunctionData(functionFragment: "batchUpdateUserDebt", values: [AddressLike[], BigNumberish[]]): string;
|
39
40
|
encodeFunctionData(functionFragment: "borrowCurrency", values: [BigNumberish]): string;
|
40
41
|
encodeFunctionData(functionFragment: "claimERC20", values: [AddressLike, BigNumberish]): string;
|
41
42
|
encodeFunctionData(functionFragment: "closeExpiredPosition", values: [BigNumberish, BigNumberish]): string;
|
@@ -61,6 +62,7 @@ export interface TradingVaultInterface extends Interface {
|
|
61
62
|
encodeFunctionData(functionFragment: "renounceOwnership", values?: undefined): string;
|
62
63
|
encodeFunctionData(functionFragment: "renounceRole", values: [BytesLike, AddressLike]): string;
|
63
64
|
encodeFunctionData(functionFragment: "repayCurrency", values: [BigNumberish]): string;
|
65
|
+
encodeFunctionData(functionFragment: "repayUserDebt", values: [BigNumberish]): string;
|
64
66
|
encodeFunctionData(functionFragment: "revokeRole", values: [BytesLike, AddressLike]): string;
|
65
67
|
encodeFunctionData(functionFragment: "rewardConfigs", values: [BigNumberish]): string;
|
66
68
|
encodeFunctionData(functionFragment: "rewardToken", values?: undefined): string;
|
@@ -80,11 +82,13 @@ export interface TradingVaultInterface extends Interface {
|
|
80
82
|
encodeFunctionData(functionFragment: "totalBorrowed", values?: undefined): string;
|
81
83
|
encodeFunctionData(functionFragment: "totalRewardsAdded", values?: undefined): string;
|
82
84
|
encodeFunctionData(functionFragment: "totalRewardsHarvested", values?: undefined): string;
|
85
|
+
encodeFunctionData(functionFragment: "totalUserDebt", values?: undefined): string;
|
83
86
|
encodeFunctionData(functionFragment: "transferFrom", values: [AddressLike, AddressLike, BigNumberish]): string;
|
84
87
|
encodeFunctionData(functionFragment: "transferOwnership", values: [AddressLike]): string;
|
85
88
|
encodeFunctionData(functionFragment: "treasury", values?: undefined): string;
|
86
89
|
encodeFunctionData(functionFragment: "updateEntryPrice", values: [BigNumberish, BigNumberish]): string;
|
87
90
|
encodeFunctionData(functionFragment: "updateRewardConfigs", values: [TradingVault.RewardConfigStruct[]]): string;
|
91
|
+
encodeFunctionData(functionFragment: "userDebt", values: [AddressLike]): string;
|
88
92
|
decodeFunctionResult(functionFragment: "BASE_WEIGHT", data: BytesLike): Result;
|
89
93
|
decodeFunctionResult(functionFragment: "DEFAULT_ADMIN_ROLE", data: BytesLike): Result;
|
90
94
|
decodeFunctionResult(functionFragment: "EXPO", data: BytesLike): Result;
|
@@ -100,6 +104,7 @@ export interface TradingVaultInterface extends Interface {
|
|
100
104
|
decodeFunctionResult(functionFragment: "batchEmitPriceUpdated", data: BytesLike): Result;
|
101
105
|
decodeFunctionResult(functionFragment: "batchSetPositionExpiration", data: BytesLike): Result;
|
102
106
|
decodeFunctionResult(functionFragment: "batchUpdateEntryPrice", data: BytesLike): Result;
|
107
|
+
decodeFunctionResult(functionFragment: "batchUpdateUserDebt", data: BytesLike): Result;
|
103
108
|
decodeFunctionResult(functionFragment: "borrowCurrency", data: BytesLike): Result;
|
104
109
|
decodeFunctionResult(functionFragment: "claimERC20", data: BytesLike): Result;
|
105
110
|
decodeFunctionResult(functionFragment: "closeExpiredPosition", data: BytesLike): Result;
|
@@ -125,6 +130,7 @@ export interface TradingVaultInterface extends Interface {
|
|
125
130
|
decodeFunctionResult(functionFragment: "renounceOwnership", data: BytesLike): Result;
|
126
131
|
decodeFunctionResult(functionFragment: "renounceRole", data: BytesLike): Result;
|
127
132
|
decodeFunctionResult(functionFragment: "repayCurrency", data: BytesLike): Result;
|
133
|
+
decodeFunctionResult(functionFragment: "repayUserDebt", data: BytesLike): Result;
|
128
134
|
decodeFunctionResult(functionFragment: "revokeRole", data: BytesLike): Result;
|
129
135
|
decodeFunctionResult(functionFragment: "rewardConfigs", data: BytesLike): Result;
|
130
136
|
decodeFunctionResult(functionFragment: "rewardToken", data: BytesLike): Result;
|
@@ -144,11 +150,13 @@ export interface TradingVaultInterface extends Interface {
|
|
144
150
|
decodeFunctionResult(functionFragment: "totalBorrowed", data: BytesLike): Result;
|
145
151
|
decodeFunctionResult(functionFragment: "totalRewardsAdded", data: BytesLike): Result;
|
146
152
|
decodeFunctionResult(functionFragment: "totalRewardsHarvested", data: BytesLike): Result;
|
153
|
+
decodeFunctionResult(functionFragment: "totalUserDebt", data: BytesLike): Result;
|
147
154
|
decodeFunctionResult(functionFragment: "transferFrom", data: BytesLike): Result;
|
148
155
|
decodeFunctionResult(functionFragment: "transferOwnership", data: BytesLike): Result;
|
149
156
|
decodeFunctionResult(functionFragment: "treasury", data: BytesLike): Result;
|
150
157
|
decodeFunctionResult(functionFragment: "updateEntryPrice", data: BytesLike): Result;
|
151
158
|
decodeFunctionResult(functionFragment: "updateRewardConfigs", data: BytesLike): Result;
|
159
|
+
decodeFunctionResult(functionFragment: "userDebt", data: BytesLike): Result;
|
152
160
|
}
|
153
161
|
export declare namespace ApprovalEvent {
|
154
162
|
type InputTuple = [
|
@@ -543,6 +551,44 @@ export declare namespace TreasuryUpdatedEvent {
|
|
543
551
|
type Log = TypedEventLog<Event>;
|
544
552
|
type LogDescription = TypedLogDescription<Event>;
|
545
553
|
}
|
554
|
+
export declare namespace UserDebtRepaidEvent {
|
555
|
+
type InputTuple = [
|
556
|
+
user: AddressLike,
|
557
|
+
debtAmount: BigNumberish,
|
558
|
+
remainingDebt: BigNumberish
|
559
|
+
];
|
560
|
+
type OutputTuple = [
|
561
|
+
user: string,
|
562
|
+
debtAmount: bigint,
|
563
|
+
remainingDebt: bigint
|
564
|
+
];
|
565
|
+
interface OutputObject {
|
566
|
+
user: string;
|
567
|
+
debtAmount: bigint;
|
568
|
+
remainingDebt: bigint;
|
569
|
+
}
|
570
|
+
type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
|
571
|
+
type Filter = TypedDeferredTopicFilter<Event>;
|
572
|
+
type Log = TypedEventLog<Event>;
|
573
|
+
type LogDescription = TypedLogDescription<Event>;
|
574
|
+
}
|
575
|
+
export declare namespace UserDebtUpdatedEvent {
|
576
|
+
type InputTuple = [
|
577
|
+
user: AddressLike,
|
578
|
+
oldDebt: BigNumberish,
|
579
|
+
newDebt: BigNumberish
|
580
|
+
];
|
581
|
+
type OutputTuple = [user: string, oldDebt: bigint, newDebt: bigint];
|
582
|
+
interface OutputObject {
|
583
|
+
user: string;
|
584
|
+
oldDebt: bigint;
|
585
|
+
newDebt: bigint;
|
586
|
+
}
|
587
|
+
type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
|
588
|
+
type Filter = TypedDeferredTopicFilter<Event>;
|
589
|
+
type Log = TypedEventLog<Event>;
|
590
|
+
type LogDescription = TypedLogDescription<Event>;
|
591
|
+
}
|
546
592
|
export interface TradingVault extends BaseContract {
|
547
593
|
connect(runner?: ContractRunner | null): TradingVault;
|
548
594
|
waitForDeployment(): Promise<this>;
|
@@ -594,6 +640,12 @@ export interface TradingVault extends BaseContract {
|
|
594
640
|
], [
|
595
641
|
void
|
596
642
|
], "nonpayable">;
|
643
|
+
batchUpdateUserDebt: TypedContractMethod<[
|
644
|
+
_users: AddressLike[],
|
645
|
+
_debts: BigNumberish[]
|
646
|
+
], [
|
647
|
+
void
|
648
|
+
], "nonpayable">;
|
597
649
|
borrowCurrency: TypedContractMethod<[
|
598
650
|
_amount: BigNumberish
|
599
651
|
], [
|
@@ -714,6 +766,11 @@ export interface TradingVault extends BaseContract {
|
|
714
766
|
], [
|
715
767
|
void
|
716
768
|
], "nonpayable">;
|
769
|
+
repayUserDebt: TypedContractMethod<[
|
770
|
+
_amount: BigNumberish
|
771
|
+
], [
|
772
|
+
void
|
773
|
+
], "nonpayable">;
|
717
774
|
revokeRole: TypedContractMethod<[
|
718
775
|
role: BytesLike,
|
719
776
|
account: AddressLike
|
@@ -792,6 +849,7 @@ export interface TradingVault extends BaseContract {
|
|
792
849
|
totalBorrowed: TypedContractMethod<[], [bigint], "view">;
|
793
850
|
totalRewardsAdded: TypedContractMethod<[], [bigint], "view">;
|
794
851
|
totalRewardsHarvested: TypedContractMethod<[], [bigint], "view">;
|
852
|
+
totalUserDebt: TypedContractMethod<[], [bigint], "view">;
|
795
853
|
transferFrom: TypedContractMethod<[
|
796
854
|
from: AddressLike,
|
797
855
|
to: AddressLike,
|
@@ -816,6 +874,7 @@ export interface TradingVault extends BaseContract {
|
|
816
874
|
], [
|
817
875
|
void
|
818
876
|
], "nonpayable">;
|
877
|
+
userDebt: TypedContractMethod<[arg0: AddressLike], [bigint], "view">;
|
819
878
|
getFunction<T extends ContractMethod = ContractMethod>(key: string | FunctionFragment): T;
|
820
879
|
getFunction(nameOrSignature: "BASE_WEIGHT"): TypedContractMethod<[], [bigint], "view">;
|
821
880
|
getFunction(nameOrSignature: "DEFAULT_ADMIN_ROLE"): TypedContractMethod<[], [string], "view">;
|
@@ -851,6 +910,12 @@ export interface TradingVault extends BaseContract {
|
|
851
910
|
], [
|
852
911
|
void
|
853
912
|
], "nonpayable">;
|
913
|
+
getFunction(nameOrSignature: "batchUpdateUserDebt"): TypedContractMethod<[
|
914
|
+
_users: AddressLike[],
|
915
|
+
_debts: BigNumberish[]
|
916
|
+
], [
|
917
|
+
void
|
918
|
+
], "nonpayable">;
|
854
919
|
getFunction(nameOrSignature: "borrowCurrency"): TypedContractMethod<[_amount: BigNumberish], [void], "nonpayable">;
|
855
920
|
getFunction(nameOrSignature: "claimERC20"): TypedContractMethod<[
|
856
921
|
_token: AddressLike,
|
@@ -955,6 +1020,7 @@ export interface TradingVault extends BaseContract {
|
|
955
1020
|
void
|
956
1021
|
], "nonpayable">;
|
957
1022
|
getFunction(nameOrSignature: "repayCurrency"): TypedContractMethod<[_amount: BigNumberish], [void], "nonpayable">;
|
1023
|
+
getFunction(nameOrSignature: "repayUserDebt"): TypedContractMethod<[_amount: BigNumberish], [void], "nonpayable">;
|
958
1024
|
getFunction(nameOrSignature: "revokeRole"): TypedContractMethod<[
|
959
1025
|
role: BytesLike,
|
960
1026
|
account: AddressLike
|
@@ -1009,6 +1075,7 @@ export interface TradingVault extends BaseContract {
|
|
1009
1075
|
getFunction(nameOrSignature: "totalBorrowed"): TypedContractMethod<[], [bigint], "view">;
|
1010
1076
|
getFunction(nameOrSignature: "totalRewardsAdded"): TypedContractMethod<[], [bigint], "view">;
|
1011
1077
|
getFunction(nameOrSignature: "totalRewardsHarvested"): TypedContractMethod<[], [bigint], "view">;
|
1078
|
+
getFunction(nameOrSignature: "totalUserDebt"): TypedContractMethod<[], [bigint], "view">;
|
1012
1079
|
getFunction(nameOrSignature: "transferFrom"): TypedContractMethod<[
|
1013
1080
|
from: AddressLike,
|
1014
1081
|
to: AddressLike,
|
@@ -1029,6 +1096,7 @@ export interface TradingVault extends BaseContract {
|
|
1029
1096
|
], [
|
1030
1097
|
void
|
1031
1098
|
], "nonpayable">;
|
1099
|
+
getFunction(nameOrSignature: "userDebt"): TypedContractMethod<[arg0: AddressLike], [bigint], "view">;
|
1032
1100
|
getEvent(key: "Approval"): TypedContractEvent<ApprovalEvent.InputTuple, ApprovalEvent.OutputTuple, ApprovalEvent.OutputObject>;
|
1033
1101
|
getEvent(key: "ApprovalForAll"): TypedContractEvent<ApprovalForAllEvent.InputTuple, ApprovalForAllEvent.OutputTuple, ApprovalForAllEvent.OutputObject>;
|
1034
1102
|
getEvent(key: "CurrencyBorrowed"): TypedContractEvent<CurrencyBorrowedEvent.InputTuple, CurrencyBorrowedEvent.OutputTuple, CurrencyBorrowedEvent.OutputObject>;
|
@@ -1052,6 +1120,8 @@ export interface TradingVault extends BaseContract {
|
|
1052
1120
|
getEvent(key: "TotalRewardsUpdated"): TypedContractEvent<TotalRewardsUpdatedEvent.InputTuple, TotalRewardsUpdatedEvent.OutputTuple, TotalRewardsUpdatedEvent.OutputObject>;
|
1053
1121
|
getEvent(key: "Transfer"): TypedContractEvent<TransferEvent.InputTuple, TransferEvent.OutputTuple, TransferEvent.OutputObject>;
|
1054
1122
|
getEvent(key: "TreasuryUpdated"): TypedContractEvent<TreasuryUpdatedEvent.InputTuple, TreasuryUpdatedEvent.OutputTuple, TreasuryUpdatedEvent.OutputObject>;
|
1123
|
+
getEvent(key: "UserDebtRepaid"): TypedContractEvent<UserDebtRepaidEvent.InputTuple, UserDebtRepaidEvent.OutputTuple, UserDebtRepaidEvent.OutputObject>;
|
1124
|
+
getEvent(key: "UserDebtUpdated"): TypedContractEvent<UserDebtUpdatedEvent.InputTuple, UserDebtUpdatedEvent.OutputTuple, UserDebtUpdatedEvent.OutputObject>;
|
1055
1125
|
filters: {
|
1056
1126
|
"Approval(address,address,uint256)": TypedContractEvent<ApprovalEvent.InputTuple, ApprovalEvent.OutputTuple, ApprovalEvent.OutputObject>;
|
1057
1127
|
Approval: TypedContractEvent<ApprovalEvent.InputTuple, ApprovalEvent.OutputTuple, ApprovalEvent.OutputObject>;
|
@@ -1099,5 +1169,9 @@ export interface TradingVault extends BaseContract {
|
|
1099
1169
|
Transfer: TypedContractEvent<TransferEvent.InputTuple, TransferEvent.OutputTuple, TransferEvent.OutputObject>;
|
1100
1170
|
"TreasuryUpdated(address,address)": TypedContractEvent<TreasuryUpdatedEvent.InputTuple, TreasuryUpdatedEvent.OutputTuple, TreasuryUpdatedEvent.OutputObject>;
|
1101
1171
|
TreasuryUpdated: TypedContractEvent<TreasuryUpdatedEvent.InputTuple, TreasuryUpdatedEvent.OutputTuple, TreasuryUpdatedEvent.OutputObject>;
|
1172
|
+
"UserDebtRepaid(address,uint256,uint256)": TypedContractEvent<UserDebtRepaidEvent.InputTuple, UserDebtRepaidEvent.OutputTuple, UserDebtRepaidEvent.OutputObject>;
|
1173
|
+
UserDebtRepaid: TypedContractEvent<UserDebtRepaidEvent.InputTuple, UserDebtRepaidEvent.OutputTuple, UserDebtRepaidEvent.OutputObject>;
|
1174
|
+
"UserDebtUpdated(address,uint256,uint256)": TypedContractEvent<UserDebtUpdatedEvent.InputTuple, UserDebtUpdatedEvent.OutputTuple, UserDebtUpdatedEvent.OutputObject>;
|
1175
|
+
UserDebtUpdated: TypedContractEvent<UserDebtUpdatedEvent.InputTuple, UserDebtUpdatedEvent.OutputTuple, UserDebtUpdatedEvent.OutputObject>;
|
1102
1176
|
};
|
1103
1177
|
}
|
package/dist/contracts.json
CHANGED
@@ -28,8 +28,8 @@
|
|
28
28
|
"TradingVault-implemented-deprecated": "0xEe8D777729B5D8239FF18E77B04cf47a73FfE516",
|
29
29
|
"USDC": "0xDd33fEeD5D44D9e89b69C8E9397292E0D6554a66",
|
30
30
|
"TradingVault": "0xDAA0505313b7448374DB560c46584b4c85432e4E",
|
31
|
-
"TradingVault-implemented": "
|
32
|
-
"TradingVault-implemented-old": "
|
31
|
+
"TradingVault-implemented": "0x65Be0a72f8BD657F22fC109CD6419c17978bd8b8",
|
32
|
+
"TradingVault-implemented-old": "0xFCC0495c471700B9200178b0458D9259b562ffE6",
|
33
33
|
"UniswapV2Factory": "0xF64C66999F62b7B86aDF3477d426c8A26b1111be",
|
34
34
|
"UniswapV2Router02": "0x4e3671ea1DdaeFa9eBB160e0fBC5D8785E0833Ab",
|
35
35
|
"PTK": "0x7A526040174f47581B7a5dEf81E65045541Bbfc6",
|
@@ -45,7 +45,9 @@
|
|
45
45
|
"EthStaking": "0x65535DCF365B6dDb16E48e59476c289a07Cd4284",
|
46
46
|
"EthStaking-implemented": "0x18897940594eBcF2cb4BD2E38d59F7FA79Dc406b",
|
47
47
|
"Erc20Staking": "0x6Ff554aeBaaf4a31d3c7a60915d4fCACC3dD570b",
|
48
|
-
"Erc20Staking-implemented": "0x3DEC7e97E82E0BeF33fDB8591fa8FbD528dDBa5f"
|
48
|
+
"Erc20Staking-implemented": "0x3DEC7e97E82E0BeF33fDB8591fa8FbD528dDBa5f",
|
49
|
+
"RestrictedErc20": "0x16333289eD8456E94710c8E4D14D0ed727363482",
|
50
|
+
"RestrictedErc20-implemented": "0x0b37b8D25AD5C747F512930FadC5353bfAD65C3A"
|
49
51
|
},
|
50
52
|
"base": {
|
51
53
|
"SeedRoundFundraiser": "0x3e7b414cAd1011c757dBA1a58212Db561dc9feeB",
|
@@ -57,6 +59,9 @@
|
|
57
59
|
"MultiLevelReferralNFT-implemented": "0xc1c5cb24f727Ad0e634F1347c8BD1396BC050c77",
|
58
60
|
"NFTTicket": "0x299d9923D9AfA0C3c7F868b948d504C4D6104b9F",
|
59
61
|
"NFTTicket-implemented": "0x6520a840CDBd1AeCB32E6331164a4445aE1148b8",
|
60
|
-
"NFTTicket-implemented-old": "0xec38C132724BF909416bc3F222DD9c3357E70C39"
|
62
|
+
"NFTTicket-implemented-old": "0xec38C132724BF909416bc3F222DD9c3357E70C39",
|
63
|
+
"TradingVault": "0x4F6CAb6b514F7920fb41A8EbD54A7CF6B4293D1F",
|
64
|
+
"Erc20Staking": "0x094131B2fEdF0bd0f60e0336d675Af484E8d58bF",
|
65
|
+
"Erc20Staking-implemented": "0x0d6566A68024020Fcb5B7E4781Bb744e0F9BADE1"
|
61
66
|
}
|
62
67
|
}
|