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.
@@ -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
  }
@@ -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 i=["Staked","Unstaked","RewardHarvested"];return await this.bootstrap(),(0,n.streamEvents)({getProvider:()=>this.getRandomProvider(),getAllEvents:(t,e)=>this.getAllEvents(t,e,i),formatEvent:t=>this.formatEventArgs(t),onEvent:e,saveLatestBlock:a,fromBlock:t,batchSize:s,sleepTime:r,blockGap:o})}};
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})}};
@@ -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
  }
@@ -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 o=["Staked","Unstaked","RewardHarvested","SignerUpdated","MinStakeUpdated"];return await this.bootstrap(),(0,s.streamEvents)({getProvider:()=>this.getRandomProvider(),getAllEvents:(t,e)=>this.getAllEvents(t,e,o),formatEvent:t=>this.formatEventArgs(t),onEvent:e,saveLatestBlock:a,fromBlock:t,batchSize:r,sleepTime:n,blockGap:i})}};
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})}};
@@ -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;
@@ -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
  }
@@ -28,8 +28,8 @@
28
28
  "TradingVault-implemented-deprecated": "0xEe8D777729B5D8239FF18E77B04cf47a73FfE516",
29
29
  "USDC": "0xDd33fEeD5D44D9e89b69C8E9397292E0D6554a66",
30
30
  "TradingVault": "0xDAA0505313b7448374DB560c46584b4c85432e4E",
31
- "TradingVault-implemented": "0xFCC0495c471700B9200178b0458D9259b562ffE6",
32
- "TradingVault-implemented-old": "0xe156e586C607E166Ead84801f55D6e5BFEF8700C",
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
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aiia-vault-sdk",
3
- "version": "1.4.0",
3
+ "version": "1.4.2",
4
4
  "description": "SDK for AIIA Vault Contract",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",